现在已经寻找了一段时间来了解如何做到这一点。
似乎所有解决方案都需要具有索引的唯一字段。
INSERT中没有IF NOT EXISTS语法,但您可以使用 ON DUPLICATE KEY 机制。假设您在 firstname、lastname 上创建了一个唯一索引,您的更新可能显示为:
INSERT INTO tb (firstname, lastname)
VALUES ('Jack', 'Doe')
ON DUPLICATE KEY UPDATE lastname = lastname;
这使得插入中性。
$sql2="INSERT INTO site_shipping (ship_oid,ship_status)
SELECT '$orderid', '$status'
FROM site_shipping
WHERE NOT EXISTS
(SELECT *
FROM site_shipping
WHERE ship_oid = '$orderid'
)
LIMIT 1
";
您是否已经考虑过INSERT OR UPDATE
mysql 的语法,或者您是否希望“取消”最新的插入而不是恢复为更新?
编辑:经过反思后,正如 afftee 所示,of 的确切语法ON DUPLICATE KEY
仅由主键或至少唯一列上的重复值触发。
一种可能的解决方案是使用BEFORE INSERT
类似于此的触发器:
CREATE TRIGGER block_dup_insert BEFORE INSERT ON my_table
FOR EACH ROW BEGIN
-- check condition and stop if it would be duplicated according to your logic
END
如果您想停止触发器并阻止实际插入,您似乎可以使用 [mysql doc][1] 上的 Nicolas Lescure 的这篇文章:
“停止操作”的另一种方法是创建一个只有一个主键(reason_to_stop)的表(stop_action)。然后你用一些文本预填充这个表('不要这样做','或者那个')=>停止动作,只需使用任何预填充值('不要那样做')。
[1]:http ://dev.mysql.com/doc/refman/5.1/en/create-trigger.html mysql 创建触发器文档
Mysql 插入文档中没有“如果不存在则插入”语法。为了解决这个问题,我预先准备好使用“Insert ... select”语法。在选择部分,您必须使用“不存在”语法添加 where 语句。例如,您可以使用这个:
insert into tbl (firstname,lastname) select 'Jhon', 'Doe'
from tbl where not exists (select 1 from tbl where firstname = 'Jhon' and lastname = 'Doe') limit 1;