在 MySQL 中使用子查询时检查插入的 table 的重复条目

Check duplicate entry to the inserted table while using a subquery in MySQL

我有两个 table:员工和测试。我需要将 Employee 的数据插入到 Test table。我这样做很成功。

但是,问题是,我需要检查 测试 Table 中的重复条目。这意味着如果存在具有相同 EmployeeId 和 UserId 的行,则不应从员工插入 Test table。我正在使用 MaridaDB。我在查询中使用了 IGNORE 关键字,但不幸的是,这并没有检查重复项!我被困在这个:(

员工

Id UserId
1 5
2 4

测试

Id EmployeeId UserId
1 1 5
2 2 4

我正在使用的查询:

INSERT IGNORE INTO authdb.test (EmployeeId, UserId)

(SELECT e.Id, e.UserId FROM basedb.employee e
WHERE e.UserId != 0);

INSERT IGNORE 依靠主键或唯一键来确定什么是唯一的。

所以要么:

ALTER TABLE test ADD UNIQUE KEY eu_uniq (EmployeeId,UserId);

或:

ALTER TABLE test ADD PRIMARY KEY (EmployeeId,UserId);

这假设 Id 还不是主键。不用的话可以去掉。

因为您不能将 SELECT 插入到同一个 table:

CREATE TEMPORARY TABLE tmp
(EmployeeId INT NOT NULL,
UserId INT NOT NULL,
PRIMARY KEY ( EmployeeId, UserId))
AS SELECT e.EmployeeId, e.UserId
FROM EmployeeId e
LEFT JOIN Test
  USING (EmployeeId, UserID)
WHERE Test.EmployeeId IS NULL
   AND e.UserId != 0

其次是:

INSERT INTO Test (EmployeeId, UserId)
SELECT * FROM tmp

如果 Test 项在语句之间被删除,这会受到竞争条件的影响。