CREATE PROCEDURE PROC_AUTO_INSERT_PATROLSITELIST
BEGIN
DECLARE T_ERROR INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET T_ERROR=1;
START TRANSACTION;
INSERT INTO tableA (SITE_ID, ORDER_ID)
SELECT (SELECT UUID_SHORT()), d.ORDERID
FROM
(
SELECT ORDERID FROM TEST LIMIT 100
) d;
IF T_ERROR=1 THEN
ROLLBACK;
SET _SUCCESS=T_ERROR;
ELSE
COMMIT;
SET _SUCCESS=T_ERROR;
END IF;
END
标红部分在存储过程中执行报主键重复插入错误,其中SITE_ID为主键
红色部分在DB执行正常
SITE_ID为主键?是整数?是自动增长的?
如果SITE_ID是整数且是自动增长的(这个跟主键其实关系并不大,但一般来说主键都会使用整数、自增长),那么你的SQL肯定有问题,因为自增长的字段是不允许在UPDATE、INSERT的时候显式的指定内容,而应该由系统自动设定。
把语句修改为:
INSERT INTO tableA ( ORDER_ID)
SELECT d.ORDERID
FROM
(
SELECT ORDERID FROM TEST LIMIT 100
) d;
就应该可以了(当然,这个是MySQL的,我对MySQL不懂,是否还有别的问题就不确定了)
主键不是自增的,是数据内部函数获取的唯一ID,自己已查出问题,谢了
应该为这样:
INSERT INTO tableA (SITE_ID, ORDER_ID)
SELECT UUID_SHORT(), d.ORDERID
FROM
(
SELECT ORDERID FROM TEST LIMIT 100
) d;
@岳帅超: 不客气,没能帮你解决问题。
不过,从你修改的代码看,只是一个括号的区别吧?难道对一个值单独添加一个括号会导致这个问题?
@519740105: 不是,是在Select语句中套用Select查询内部函数了,
Select (Select UUID_SHORT()),ORDERID from tableA;
改为:
Select UUID_SHORT(),ORDERID from tableA;
在存储过程中不行,在正常情况下执行时可以的,存储过程要求严格了
CREATE PROCEDURE PROC_AUTO_INSERT_PATROLSITELIST
BEGIN
DECLARE T_ERROR INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET T_ERROR=1;
START TRANSACTION;
INSERT INTO tableA (SITE_ID, ORDER_ID)
SELECT UUID_SHORT(), d.ORDERID
FROM
(
SELECT ORDERID FROM TEST LIMIT 100
) d;
IF T_ERROR=1 THEN
ROLLBACK;
SET _SUCCESS=T_ERROR;
ELSE
COMMIT;
SET _SUCCESS=T_ERROR;
END IF;
END