SQL:只将新行/记录插入表中?

med*_*iev 5 php mysql sql zend-framework zend-db

我正在定期解析json feed并且只需要从feed中插入最新用户并忽略现有用户.

我认为我需要的是ON DUPLICATE KEY UPDATEINSERT IGNORE基于一些搜索,但我不太确定我问的是什么 - 例如:

users
1     John
2     Bob
Run Code Online (Sandbox Code Playgroud)

部分JSON:

{ userid:1, name:'John' },
{ userid:2, name:'Bob' },
{ userid:3, name:'Jeff' }
Run Code Online (Sandbox Code Playgroud)

从这个饲料我只想插入杰夫.我可以通过所有用户做一个简单的循环,并做一个简单的SELECT查询,看看用户id是否已经在表中,如果不是我做INSERT,但我怀疑它不是一个有效和实用的方法.

顺便说一句,如果有人愿意提供具体的答案,我正在使用Zend_Db进行数据库交互:)我不介意一般的战略解决方案.

Hen*_*pel 5

ON DUPLICATE KEY UPDATE替代允许引用更新与插入决定到数据库:

INSERT INTO table (userid, name) VALUES (2, 'Bobby');
  ON DUPLICATE KEY UPDATE name = 'Bobby';
Run Code Online (Sandbox Code Playgroud)

如果已存在具有用户标识2的条目,则会将名称字段更新为"Bobby".

INSERT IGNORE如果您向UPDATE提供无效操作,则可以使用它作为替代方法:

INSERT INTO table (userid, name) VALUES (2, 'Bobby');
  ON DUPLICATE KEY UPDATE name = name;
Run Code Online (Sandbox Code Playgroud)

如果用户标识2已存在,则无效,从而避免了警告和吞下您在使用时遇到的其他错误INSERT IGNORE.


另一种选择是REPLACE:

REPLACE INTO table (userid, name) VALUES (2, 'Bobby');
Run Code Online (Sandbox Code Playgroud)

如果用户标识2尚不存在,这将执行正常插入.如果它确实存在,它将首先删除旧条目,然后插入一个新条目.


请注意,这两个版本都是SQL特定于MySQL的扩展.