繁体   English   中英

带有子查询或两个单独查询的MySQL单个查询

[英]Mysql single query with subquery or two separate queries

我有以下结构的表:

id | storeid | code

id是主键

我想以这种增量顺序在此表中插入数据:

id | storeid | code
1  |       2 | 1 
2  |       2 | 2 
3  |       2 | 3 
4  |       2 | 4 

我有两种解决方案来完成此任务。

1)使用PHP触发查询以从表中获取最后一条记录( code ),并使用PHP使用1递增code值,然后在第二次查询之后将递增的值插入数据库。

2)这个单一查询: "INSERT INTO qrcodesforstore (storeid,code) VALUES (2,IFNULL((SELECT t.code+1 FROM (select code from qrcodesforstore order by id desc limit 1) t),1))"

我只想建议哪种方法最好,以及为什么要表现。 我目前正在使用第二种方法,但是由于使用三级子查询,因此对性能感到困惑。

在此处输入图片说明 您将字段声明为主键,并指定唯一和自动递增键,它们会自动递增值

您可以将code列设置为AUTO_INCREMENT ,而无需将其设置为主键,请参见this

无论如何,第二种解决方案会更好,只有一个查询比两个更好。

您只需将INSERT与SELECT和MAX()结合使用:

INSERT INTO qrcodesforstore 
(storeid, code) 
(SELECT 2, IFNULL((MAX(code)+1),1) FROM qrcodesforstore)

SQLFiddle

将其包装在触发器中:-

DELIMITER $$
DROP TRIGGER IF EXISTS bi_qrcodesforstore$$
CREATE TRIGGER bi_qrcodesforstore BEFORE INSERT ON qrcodesforstore
FOR EACH ROW
BEGIN
    DECLARE max_code    INT;
    SELECT MAX(code) INTO max_code FROM qrcodesforstore;
    IF max_code IS NULL THEN
        SET max_code := 1;
    ELSE
        SET max_code := max_code + 1;
    END IF
    SET NEW.code := max_code;
END 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM