Xeo*_*oss 3 mysql database insert
应用程序中的标准问题是如果记录不存在则插入记录 - 如果记录存在则更新.在PRIMARY KEY未知的情况下,通过发出a SELECT然后运行INSERT或者UPDATE如果找到记录,通常可以解决这个问题.
但是,我知道至少有三种方法可以将记录插入到数据库中,即使记录已经存在.就个人而言,如果已经存在,我宁愿删除新的插入请求,但是在某些情况下,您可能希望删除数据库中的记录并使用新记录.
CREATE TABLE IF NOT EXISTS `table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`foo` int(10) unsigned NOT NULL,
`bar` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `row` (`foo`,`bar`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
以下是三种方法:
INSERT IGNORE INTO table (foo, bar) VALUES (2,3);
INSERT INTO table (foo, bar) VALUES (2,3) ON DUPLICATE KEY UPDATE;
REPLACE INTO table (foo, bar) VALUES (2,3);
在什么时候应该使用这些方法?
有人能给出一些正确的使用场景的例子吗?
INSERT 当你只想插入一个新行时应该使用它
假设您正在存储日志条目,您将要记录每个事件,使用INSERT.
INSERT IGNORE 当你只想在表中存在特定的键时,应该使用它,如果它是创建它的当前插入,或者它是否已经存在,则无关紧要.
假设您有一个电话号码表和使用次数表,您会找到一个您不确定的新电话号码,但是您希望它在那里.
你用它INSERT IGNORE来确保它在那里.
REPLACE INTO 当你想确保表中存在特定的键时,应该使用它,如果它存在,你想要使用的新值,而不是当前的值.
您有另一个带有电话号码的表,这次您会找到一个新号码和一个与之关联的名称.
您可以使用REPLACE INTO查找和更新完整记录,或只是插入新信息.
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
请注意,这不是另一种编写方法,REPLACE INTO只要您确定存在特定密钥,但是如果它确实更新了某些列,而不是所有列,则应使用上述方法.
例如,如果您要存储来自某个IP的访问次数,以及该用户访问过的第一个页面.
INSERT INTO visitors (ip,visits,first_page) VALUES (<ip>,1,<current_page>) ON DUPLICATE KEY visits = visits +1;