MySQL:存储过程

时间:2017-12-01 23:42:10

标签: mysql stored-procedures

我正在使用存储过程将行插入到我的表中,而我的数据库是在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的原因是我定义的副本在此示例中是非常自定义的,并且很难使用任何主键定义重复项。

0 个答案:

没有答案