【问题标题】:How to insert into values without duplicates?如何插入没有重复的值?
【发布时间】:2019-10-20 18:39:46
【问题描述】:

我在另一个名为“workers”的数据库上创建了新表:

CREATE TABLE workers (
ID_WORKER int(11) NOT NULL,
FNAME varchar(20) NOT NULL,
LNAME varchar(20) NOT NULL,
WORKERS_GROUP varchar(20) NOT NULL,
POSITION varchar(50) NOT NULL,
CARD_NUMBER varchar(30) NOT NULL
)

在 AUTO_INCREMENT 上设置了哪个“ID_WORKER”列。然后我第一次只插入了一条记录:

INSERT INTO workers (FNAME, LNAME, WORKERS_GROUP, POSITION, CARD_NUMBER) 
VALUES ('Paul', 'King', 'IT', 'Programmer', '');

但在接下来的时间里,我尝试使用另一种方法插入(我将描述我尝试过的方法)并且我有一些重复。

我尝试了什么?

我已经尝试过至少 3 种不重复的插入方法:

1) 通过 INSERT IGNORE INTO:

INSERT IGNORE INTO workers (FNAME, LNAME, WORKERS_GROUP, POSITION, CARD_NUMBER)

2) 通过替换为:

REPLACE INTO workers (FNAME, LNAME, WORKERS_GROUP, POSITION, CARD_NUMBER) 
VALUES ('Paul', 'King', 'IT', 'Programmer', '');

3) 通过 INSERT INTO ... 重复键更新:

INSERT INTO workers (FNAME, LNAME, WORKERS_GROUP, POSITION, CARD_NUMBER) 
VALUES ('Paul', 'King', 'IT', 'Programmer', '') 
ON DUPLICATE KEY UPDATE FNAME = 'Paul' AND LNAME = 'King' AND WORKERS_GROUP = 'IT' AND POSITION = 'Programmer' AND CARD_NUMBER = ''

而且没有一个不起作用。我不知道或不知道在哪里可以找到它们。任何想法都可以提供任何帮助。

编辑

至于重复项可以是所有重复项,但在这种情况下,具有相同FNAME, LNAME 的工人可以在同一个WORKER_GROUP 中,因为他/她必须有另一个POSITIONCARD_NUMBER .

【问题讨论】:

  • 在您的CREATE TABLE 脚本中,没有您所说的AUTO_INCREMENT
  • 您的表定义中没有定义任何可以阻止您插入'Paul', 'King', 'IT', 'Programmer', '' 1000 次的内容。
  • 您可以使用INSERT IGNORE,但您必须在FNAME, LNAME, WORKERS_GROUP, POSITION, CARD_NUMBER 的组合上创建唯一索引。
  • 我以为你的意思是重复的ID_WORKER。我不会检查重复的工人。如果您有 2 个具有相同名字和名称的人在同一组中的同一位置工作怎么办。这可能很少见,但可能会发生
  • 那么您认为哪些列不应该重复

标签: mysql duplicates insert-update insert-into


【解决方案1】:
INSERT INTO workers (FNAME, LNAME, WORKERS_GROUP, POSITION, CARD_NUMBER)
SELECT DISTINCT w1.FNAME, w1.LNAME, w1.WORKERS_GROUP, w1.POSITION, w1.CARD_NUMBER
FROM workers w1
WHERE NOT EXISTS (SELECT 1 
                  FROM workers w2
                  WHERE w2.FNAME = w1.FNAME
                    AND w2.LNAME= w1.LNAME
                    AND w2.WORKERS_GROUP= w1.WORKERS_GROUP
                    AND w2.POSITION = w1.POSITION
                    AND s2.CARD_NUMBER = w1.CARD_NUMBER)

【讨论】:

  • 真的不确定你在这里建议什么? 好的答案将始终解释所做的工作以及这样做的原因,不仅适用于 OP,而且适用于 SO 的未来访问者,他们可能会发现这个问题并正在阅读您的答案。如果回答得很好,也许他们会支持它。
  • 防止新行重复
  • @kishan 你能告诉我你的代码中的WHERE NOT EXISTS (SELECT 1 是什么类型的吗?是关于 ID_Worker 的吗?我知道别名 w1 和 w2 对 1 个表工作人员有吸引力,对吧?
  • @kishan 但顺便说一句,我必须插入值。不仅选择。
  • @kishan 您可以将 SELECT DISTINCT w1.FNAME, w1.LNAME, w1.WORKERS_GROUP, w1.POSITION, w1.CARD_NUMBER FROM workers w1 替换为您想要的值,例如 SELECT FNAME, LNAME, WORKERS_GROUP, POSITION, CARD_NUMBER FROM (SELECT 'Paul' as FNAME, 'King' AS LNAME, 'IT' AS WORKERS_GROUP, 'Programmer' AS POSITION, '' AS CARD_NUMBER) AS w1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多