在 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
项在语句之间被删除,这会受到竞争条件的影响。
我有两个 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
项在语句之间被删除,这会受到竞争条件的影响。