我正在使用存储过程将行插入到我的表中,而我的数据库是在mysql中。
这是我桌子的架构和列:
username varchar(255)
serial VARCHAR(255)
document VARCHAR(255)
last DATETIME
我使用此存储过程的原因是为了防止“重复文档”。
重复项的定义被自定义为“以”客户端:“在同一用户名下”开头的文档,或者以“个人:”开头的文档“在相同的序列下”。 (对于任何特定的给定序列,它映射到一个用户名,用户名可以有一个或多个序列号。)
这是我的存储过程:
CREATE DEFINER=`dbname`@`%` PROCEDURE `insert_table`(
IN client varchar(255),
IN serial VARCHAR(255),
IN document VARCHAR(255),
IN last DATETIME
)
IF ((SELECT COUNT(*) FROM table
WHERE (
#Find a document that's the same client, if the document starts with client:,
#or a document that's under the same serial, if the document starts with 'personal:'
#case does not matter since the input is already all caps:
`document`=document AND
((`document` NOT like 'PERSONAL:%' AND `username`=client) OR (`document` like 'PERSONAL:%' AND `serial`=serial))
)
)>0) THEN
BEGIN
UPDATE table
#Up the last when found
SET `last`=last
WHERE (
`document`=document AND
((`document` NOT like 'PERSONAL:%' AND `username`=client)
OR (`document` like 'PERSONAL:%' AND `serial`=serial))
);
END;
ELSE
BEGIN
INSERT INTO table
(`username`, `serial`, `document`, `last`)
VALUES (client, serial, document, last);
END;
END IF
然而,结果并非我所期望的。 如果我从空桌开始,我期待的是:
_____________________________________________________
|username |serial |document |last |
_____________________________________________________
|Google |123123 |Client:Map |2017-01-01 |
-----------------------------------------------------
|Google |456456 |PERSONAL:Map2 |2000-10-24 |
-----------------------------------------------------
|Google |24680 |PERSONAL:Gmail|2001-08-11 |
-----------------------------------------------------
|Walmart |789789 |Personal:Meat |1998-07-04 |
-----------------------------------------------------
|Walmart |1001001 |Client:Meat2 |1998-07-04 |
-----------------------------------------------------
|NVDA |1100101 |Client:GPU |2016-02-11 |
-----------------------------------------------------
|NVDA |123456 |Personal:GPU2 |1997-02-28 |
_____________________________________________________
但结果是:
_____________________________________________________
|username |serial |document |last |
_____________________________________________________
|Google |123123 |Client:Map |2017-01-01 |
-----------------------------------------------------
|Walmart |789789 |Personal:Meat |1998-07-04 |
-----------------------------------------------------
|NVDA |1100101 |Client:GPU |2016-02-11 |
_____________________________________________________
我发现每个用户名只插入了第一行(元素)。 SELECT COUNT(*) FROM...
很好,因为我复制它并在单独的查询中测试它,它什么都不返回。
我正在尝试解释插入的表:为什么有些行没有插入到我的表中?
我没有使用INSERT ... ON DUPLICATE KEY UPDATE
的原因是我定义的副本在此示例中是非常自定义的,并且很难使用任何主键定义重复项。