python - 如果一行中不存在所有值,则插入记录

标签 python mysql sql

<分区>

我有三列:a、b、c。

如果行中不存在 a、b、c,我想插入一个新行。

使用 Python 来做到这一点。

INSERT INTO mytable(column_a, column_b, column_c) 
VALUES(value_a, value_b, value_c) 
WHERE value_a, value_b, value_c are all unique in existing rows. 

最佳答案

如果您愿意实现一种通用机制来避免在列 column_a/b/c 上出现重复,您可以简单地在两列上添加一个复合唯一约束,例如

ALTER TABLE mytable 
ADD CONSTRAINT constr_ID UNIQUE (column_a, column_b, column_c);

如果表上发生任何会产生重复项的操作,MySQL 将引发约束违反错误。您可以使用 ON DUPLICATE KEY UPDATE 选项忽略该错误:

INSERT INTO mytable(column_a, column_b, column_c)
VALUES(value_a, value_b, value_c)
ON DUPLICATE KEY UPDATE column_a = column_a;

在这个 demo on DB Fiddle ,我们插入了 3 条记录,其中有 2 条重复记录,最终我们在表中得到了 2 条记录,正如预期的那样。


另一方面,如果您想将重复检查限制为仅一个查询,和/或如果您想避免在重复键上浪费自动增量序列,那么您可以求助于 INSERT ... SELECT 语句,带有执行重复检查的 WHERE NOT EXISTS 条件:

INSERT INTO mytable(column_a, column_b, column_c)
SELECT src.*
FROM (SELECT value_a column_a, value_b column_b, value_c column_c) src
WHERE NOT EXISTS (
    SELECT 1 
    FROM mytable
    WHERE 
        column_a = src.column_a 
        AND column_b = src.column_b 
        AND column_c = src.column_c
);

如果您尝试插入重复项,查询将不执行任何操作(并且不会生成错误或警告)。

Demo on DB Fiddle .

关于python - 如果一行中不存在所有值,则插入记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54659478/

相关文章:

mysql - 谁能加速我的 MySQL 存储过程?

mysql - docker-compose nodejs 在运行 docker composer 时出错。 MySQL ER_NOT_SUPPORTED_AUTH_MODE

php - 通过 php 将 jQuery 对象(exif 坐标)发送到我在 MySql 中的表

mysql - SQL 查询破坏了我们的游戏! (后端服务器已满)

python - SQLAlchemy 可以在不查询数据库的情况下填充外键关系吗?

python - "/lib64"与 "/lib/../lib64/"不同吗?

sql - 查询SQL数据库,如何获取用户位置附近的最近点?

sql - 在一个查询中聚合分组结果集中的所有单个列 : is it possible?

python - PyBrain 神经元操作

python - 分区中唯一子字符串的最大数量