代码之家  ›  专栏  ›  技术社区  ›  Arshanvit

检查MYSQL中的查询约束[duplicate]

  •  0
  • Arshanvit  · 技术社区  · 6 年前

    首先我创建了一个

    CREATE TABLE Customer (
      SD integer CHECK (SD > 0),
      Last_Name varchar (30),
      First_Name varchar(30)
    );
    

    然后在该表中插入值

    INSERT INTO Customer values ('-2','abc','zz');
    

    0 回复  |  直到 12 年前
        1
  •  139
  •   Bill Karwin    5 年前

    MySQL 8.0.16 是第一个支持检查约束的版本。

    阅读 https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html

    MySQL Reference Manual 说:

    这个 CHECK 子句已被所有存储引擎分析但忽略。

    试试扳机。。。

    mysql> delimiter //
    mysql> CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer 
        -> FOR EACH ROW 
        -> BEGIN 
        -> IF NEW.SD<0 THEN 
        -> SET NEW.SD=0; 
        -> END IF; 
        -> END
        -> //
    mysql> delimiter ;
    

    希望能有所帮助。

        2
  •  73
  •   Michel Feldheim    9 年前

    不幸的是,MySQL不支持SQL检查约束。出于兼容性的原因,您可以在DDL查询中定义它们,但它们只是被忽略。

    有一个简单的选择

    BEFORE INSERT BEFORE UPDATE

    例如 插入前

    DELIMITER $$
    CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Test`
    FOR EACH ROW
    BEGIN
        IF CHAR_LENGTH( NEW.ID ) < 4 THEN
            SIGNAL SQLSTATE '12345'
                SET MESSAGE_TEXT := 'check constraint on Test.ID failed';
        END IF;
    END$$   
    DELIMITER ;  
    

    在MySQL 5.5之前,必须导致错误,例如调用未定义的过程。

    在这两种情况下,这都会导致隐式事务回滚。

    如果不想回滚事务(INSERT/UPDATE应该通过,即使“check constraint”失败,也可以使用 SET NEW.ID = NULL 它会将id设置为字段的默认值,但对于id tho来说并没有意义

    编辑: 删除了这段离题的引语。

    关于 :=

    不像 = ,和 := 在任何有效的SQL语句中(不仅仅是在SET语句中)为变量赋值。

    https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html

    标识符引号字符是倒勾(`)

    如果启用了ANSI_QUOTES SQL模式,则还允许在双引号内引用标识符

    http://dev.mysql.com/doc/refman/5.6/en/identifiers.html

        3
  •  51
  •   ypercubeᵀᴹ    11 年前

    CHECK CREATE TABLE

    这个 支票

        4
  •  15
  •   Mark Chesney    9 年前

    这个 CHECK

    查看此错误报告: https://bugs.mysql.com/bug.php?id=3464

        5
  •  8
  •   Markus Barthlen    7 年前

    正如joanq MariaDB提到的,现在似乎支持检查约束和其他好处:

    MDEV-7563 )."

    https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/

        6
  •  1
  •   James    5 年前

    从8.0.15版起支持检查约束(尚未发布)

    https://bugs.mysql.com/bug.php?id=3464

    【1月23日16:24】保罗·杜布瓦

    由开发人员发布:在8.0.15中修复。

    所有存储引擎的表和列检查约束。

        7
  •  1
  •   sdlins    5 年前

    更新至MySQL 8.0.16以使用 checks :

    从MySQL 8.0.16开始,CREATE TABLE允许TABLE的核心特性 和列检查约束,适用于所有存储引擎。创建表 允许对两个表使用以下检查约束语法 约束和列约束

    MySQL Checks Documentation

        8
  •  -1
  •   Mark Hall    12 年前

    试一试 set sql_mode = 'STRICT_TRANS_TABLES' SET sql_mode='STRICT_ALL_TABLES'