从 LAST_INSERT_ID() 声明变量的 mysql 通用语法错误 - 难以分析

Posted

技术标签:

【中文标题】从 LAST_INSERT_ID() 声明变量的 mysql 通用语法错误 - 难以分析【英文标题】:mysql generic syntax error for declaration of variable from LAST_INSERT_ID() - hard to analyse 【发布时间】:2018-12-14 10:42:18 【问题描述】:

我正在尝试根据插入的插入 ID 设置变量。于是我写了:

INSERT INTO person (first_name, last_name, middle_names, suffix, title)
VALUES ("Frank", "Thring", "", "", "Mr");
SET @person_frank_thring_id = LAST_INSERT_ID();

INSERT INTO address (line2, line3, postcode, state, suburb)
VALUES ("Dock 3", "22 Boundary Rd", 2088, "NSW", "Mascot");
SET @address_franks_aircraft_maintenance_id = LAST_INSERT_ID();

INSERT INTO contact (email, phone)
VALUES ("info@franks.com", "0245732552");
SET @contact_franks_aircraft_maintenance_id = LAST_INSERT_ID();

INSERT INTO maintainer (abn, address_id, contact_id, nk, name, person_id)
VALUES (73507986550, @address_franks_aircraft_maintenance_id, @contact_franks_aircraft_maintenance_id,
"c49439a4-a24a-4e1b-bc92-ebad6caf5e74", "Frank's Airplane Repairs", @person_frank_thring_id);
SET @maintainer_franks_maint_id = LAST_INSERT_ID();

INSERT INTO approved_process (nk, approval_number, description, expires, maintainer_id)
VALUES ("ee114aab-d201-498d-85a4-2b95e9df8b3d", "13226A", "Welding and Heat Treatment", "2021-05-02", @maintainer_franks_maint_id);

人、地址、联系人和维护者都是预先存在的表。我单独运行了前三个插入,并检查了数据是否已插入到表中。当我运行整个块时,我得到一个非常普遍的错误:

[查询 73 中的错误] 您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 2 行的“@maintainer_franks_maint_id”附近使用正确的语法 执行停止!

编辑 - 请参阅下面的 DROP 和 CREATE 语句:

DROP TABLE IF EXISTS address;
DROP TABLE IF EXISTS contact;
DROP TABLE IF EXISTS person;
DROP TABLE IF EXISTS maintainer;

CREATE TABLE person (
    id BIGINT NOT NULL AUTO_INCREMENT,
    first_name varchar(255),
    last_name varchar(255),
    middle_names varchar(255),
    suffix varchar(255),
    title varchar(255),
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE address (
    id BIGINT NOT NULL AUTO_INCREMENT,
    line1 varchar(255),
    line2 varchar(255),
    line3 varchar(255),
    postcode integer,
    state varchar(255),
    suburb varchar(255),
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE contact (
    id BIGINT NOT NULL AUTO_INCREMENT,
    email varchar(255),
    fax varchar(255),
    mobile varchar(255),
    phone varchar(255),
    address_id bigint,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE maintainer (
    id BIGINT NOT NULL AUTO_INCREMENT,
    abn bigint,
    image varchar(255),
    nk varchar(255),
    name varchar(255),
    address_id bigint,
    contact_id bigint,
    person_id bigint,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

ALTER TABLE maintainer 
ADD CONSTRAINT UK_maintainer_nk unique (nk);

ALTER TABLE maintainer 
ADD CONSTRAINT FKs7jo395jusgm3631g7w845wy4 FOREIGN KEY (address_id) REFERENCES address (id);

ALTER TABLE maintainer 
ADD CONSTRAINT FKgixmfq21peg70qtff3q4ktq1 FOREIGN KEY (contact_id) REFERENCES contact (id);

ALTER TABLE maintainer 
ADD CONSTRAINT FK86boj3163qysduc7x3a2m84mh FOREIGN KEY (person_id) REFERENCES person (id);

并添加批准+流程:

CREATE TABLE approved_process (
    id BIGINT NOT NULL AUTO_INCREMENT,
    nk varchar(255),
    approval_number varchar(255),
    description varchar(255),
    expires date,
    maintainer_id bigint,
    subcontractor_id bigint,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

我希望这能澄清一些事情。

【问题讨论】:

您通过什么来运行这些查询?你说前四个是“预先存在的表”;那第四个是什么?只是新创建的东西,还是有其他不同之处?它的 CREATE TABLE 是什么样的? 好吧,我用的是sequel pro,虽然同样的事情发生在mysql命令行上,所以我不认为它是软件。整个脚本相当大,所以我觉得在这里展示它并不是一个好主意,但我已经用相关的创建更新了答案。 approved_process没有定义? 是的,不好意思,有,我现在加一下 我会检查@maintainer_franks_maint_id之前的空格是否是正确的空格,或者某种特殊字符。 【参考方案1】:

对不起大家,这似乎是某种程度的用户错误。有两个问题:一个是INSERT INTO approved_process 行开头的一个奇怪的隐形字符,而且由于某种原因,Sequel Pro 无法区分电子邮件值中的@franks 和开头的@franks。变量声明。

【讨论】:

以上是关于从 LAST_INSERT_ID() 声明变量的 mysql 通用语法错误 - 难以分析的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 插入并将 LAST_INSERT_ID() 保存到变量中

是否可以从不同的数据库中获取 LAST_INSERT_ID() ?

如何从事务中的特定查询中检索 last_insert_id?

存储过程的 LAST_INSERT_ID() 结果

MySQL 从存储过程中检索 last_insert_id

使用从 php 中选择 last_insert_id() 不起作用