Mysql单查询带子查询或两个单独的查询

时间:2016-02-19 11:54:19

标签: php mysql

我的表格有以下结构:

id | storeid | code

id是主键的位置

我想在此表中使用增量顺序插入数据,如下所示:

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

我有两个解决方案来完成这项任务。

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

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))"

我只是想知道哪种方法最好,为什么表现。 我目前正在使用第二种方法但是因为我使用三级子查询而混淆了性能。

4 个答案:

答案 0 :(得分:0)

enter image description here您将该字段声明为主键,并将唯一和自动递增键声明为自动递增值

答案 1 :(得分:0)

您可以将code列设置为AUTO_INCREMENT,不需要将其设置为主键,请参阅this

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

答案 2 :(得分:0)

你可以使用INSERT和SELECT和MAX():

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

SQLFiddle

答案 3 :(得分:0)

将其包裹在触发器中: -

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 
相关问题