我正在尝试执行以下查询:
INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name='value'
);
但是这会返回一个错误。基本上我不想插入一个记录,如果记录的“名称”字段已经存在于另一个记录-如何检查新名称是否唯一?
我正在尝试执行以下查询:
INSERT INTO table_listnames (name, address, tele)
VALUES ('Rupert', 'Somewhere', '022')
WHERE NOT EXISTS (
SELECT name FROM table_listnames WHERE name='value'
);
但是这会返回一个错误。基本上我不想插入一个记录,如果记录的“名称”字段已经存在于另一个记录-如何检查新名称是否唯一?
当前回答
工作:
INSERT INTO users (full_name, login, password)
SELECT 'Mahbub Tito','tito',SHA1('12345') FROM DUAL
WHERE NOT EXISTS
(SELECT login FROM users WHERE login='tito');
其他回答
你可以简单地使用以下方法:
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
通过这种方式,您可以插入任何新的原始数据,如果有重复的数据,则替换特定的列(最好的列是时间戳)。 例如:
CREATE TABLE IF NOT EXISTS Devices (
id INT(6) NOT NULL AUTO_INCREMENT,
unique_id VARCHAR(100) NOT NULL PRIMARY KEY,
created_at VARCHAR(100) NOT NULL,
UNIQUE KEY unique_id (unique_id),
UNIQUE KEY id (id)
)
CHARACTER SET utf8
COLLATE utf8_unicode_ci;
INSERT INTO Devices(unique_id, time)
VALUES('$device_id', '$current_time')
ON DUPLICATE KEY UPDATE time = '$current_time';
MySQL提供了一个非常可爱的解决方案:
REPLACE INTO `table` VALUES (5, 'John', 'Doe', SHA1('password'));
非常容易使用,因为您已经声明了一个唯一的主键(这里的值为5)。
您正在插入而不是更新结果。 您可以在主列中定义名称列或将其设置为惟一的。
工作:
INSERT INTO users (full_name, login, password)
SELECT 'Mahbub Tito','tito',SHA1('12345') FROM DUAL
WHERE NOT EXISTS
(SELECT login FROM users WHERE login='tito');
INSERT不允许语法中的WHERE。
你可以做的是:在字段上创建一个UNIQUE INDEX,它应该是唯一的(name),然后使用:
正常插入(如果名称已经存在,则处理错误) INSERT IGNORE(如果name已经存在,将无声失败,导致警告(而不是错误)) 插入……ON DUPLICATE KEY UPDATE(如果名称已经存在,将在末尾执行UPDATE,请参阅文档)