📅  最后修改于: 2023-12-03 14:50:03.997000             🧑  作者: Mango
MySQL提供了两种模式:非全SQL模式和全SQL模式。全SQL模式是MySQL的最高SQL标准兼容性模式,它执行的是严格的SQL语法和一些限制条件。使用全SQL模式可以使开发者编写的SQL语句更加严谨、符合标准,从而提升系统的可靠性。
虽然MySQL已经将全SQL模式定义为默认的SQL模式,但是为了让读者更加理解全SQL模式的SQL语法,下面列出一些全SQL模式的语法限制:
不允许插入非空值或不包含默认值的列: 如果列定义为非空或不包含默认值,则必须将该列包含在INSERT语句的值列表中。
CREATE TABLE test (
id INT NOT NULL,
name VARCHAR(10) NOT NULL
);
INSERT INTO test(id) VALUES (1); -- 错误
INSERT INTO test(id, name) VALUES (1, 'test'); -- 正确
不允许更新或删除无条件的表行: 在更新或删除语句中必须使用WHERE子句指定要更新或删除的行。
CREATE TABLE test (
id INT NOT NULL,
name VARCHAR(10)
);
INSERT INTO test(id, name) VALUES (1, 'test1');
INSERT INTO test(id, name) VALUES (2, 'test2');
UPDATE test SET name = 'test3'; -- 错误
UPDATE test SET name = 'test3' WHERE id = 1; -- 正确
DELETE FROM test; -- 错误
DELETE FROM test WHERE id = 1; -- 正确
不允许使用引用未引入的表: 在使用外键时,必须将引用的表与被引用的表一起声明。
CREATE TABLE a (
id INT PRIMARY KEY
);
CREATE TABLE b (
a_id INT,
FOREIGN KEY (a_id) REFERENCES a(id)
);
不允许自动转换字符串: 在进行比较和排序时,字符串类型必须明确指定。
CREATE TABLE test (
id INT NOT NULL,
name VARCHAR(10) NOT NULL
);
INSERT INTO test(id, name) VALUES (1, '1');
INSERT INTO test(id, name) VALUES (2, '10');
SELECT id, name FROM test ORDER BY name; -- 错误
SELECT id, name FROM test ORDER BY CAST(name AS UNSIGNED); -- 正确
全SQL模式是MySQL的最高SQL标准兼容性模式,它执行的是严格的SQL语法和一些限制条件,可以使开发者编写的SQL语句更加严谨、符合标准。在开发过程中建议使用全SQL模式。