📜  全sql模式——SQL(1)

📅  最后修改于: 2023-12-03 14:50:03.997000             🧑  作者: Mango

全SQL模式——SQL

介绍

MySQL提供了两种模式:非全SQL模式和全SQL模式。全SQL模式是MySQL的最高SQL标准兼容性模式,它执行的是严格的SQL语法和一些限制条件。使用全SQL模式可以使开发者编写的SQL语句更加严谨、符合标准,从而提升系统的可靠性。

语法

虽然MySQL已经将全SQL模式定义为默认的SQL模式,但是为了让读者更加理解全SQL模式的SQL语法,下面列出一些全SQL模式的语法限制:

  1. 不允许插入非空值或不包含默认值的列: 如果列定义为非空或不包含默认值,则必须将该列包含在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'); -- 正确
    
  2. 不允许更新或删除无条件的表行: 在更新或删除语句中必须使用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; -- 正确
    
  3. 不允许使用引用未引入的表: 在使用外键时,必须将引用的表与被引用的表一起声明。

    CREATE TABLE a (
      id INT PRIMARY KEY
    );
    CREATE TABLE b (
      a_id INT, 
      FOREIGN KEY (a_id) REFERENCES a(id)
    );
    
  4. 不允许自动转换字符串: 在进行比较和排序时,字符串类型必须明确指定。

    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模式。