Mysql 如何在SQL中定义一个表,其中有两个字段不依赖于null(必需)?

Mysql 如何在SQL中定义一个表,其中有两个字段不依赖于null(必需)?,mysql,sql,create-table,Mysql,Sql,Create Table,Not null dependent表示至少有1个字段不为null 想法 示例:电子邮件和电话号码不能为空。如果电子邮件为空,则电话号码不得为空。如果电话号码为空,则电子邮件不得为空 CREATE TABLE T ( EMAIL VARCHAR(256), PHONE VARCHAR(10) ); ALTER TABLE T ADD CONSTRAINT CHECK (EMAIL IS NOT NULL) OR (PHONE IS NOT NULL); 某些SQL方言允许或要求您

Not null dependent表示至少有1个字段不为null

想法

示例:电子邮件和电话号码不能为空。如果电子邮件为空,则电话号码不得为空。如果电话号码为空,则电子邮件不得为空

CREATE TABLE T (
  EMAIL VARCHAR(256),
  PHONE VARCHAR(10)
);

ALTER TABLE T ADD CONSTRAINT
  CHECK (EMAIL IS NOT NULL) OR (PHONE IS NOT NULL);
某些SQL方言允许或要求您在
CREATE TABLE
语句中放置
CHECK
约束

alter table the_table add constraint check_two_columns 
     check (   (email is null and phone_number is not null) 
            or (email is not null and phone_number is null));
某些SQL方言允许或要求您在
CREATE TABLE
语句中放置
CHECK
约束

alter table the_table add constraint check_two_columns 
     check (   (email is null and phone_number is not null) 
            or (email is not null and phone_number is null));
某些SQL方言允许或要求您在
CREATE TABLE
语句中放置
CHECK
约束

alter table the_table add constraint check_two_columns 
     check (   (email is null and phone_number is not null) 
            or (email is not null and phone_number is null));
某些SQL方言允许或要求您在
CREATE TABLE
语句中放置
CHECK
约束

alter table the_table add constraint check_two_columns 
     check (   (email is null and phone_number is not null) 
            or (email is not null and phone_number is null));
您没有说明您的DBMS,但这将无法与MySQL一起使用

您没有说明您的DBMS,但这将无法与MySQL一起使用

您没有说明您的DBMS,但这将无法与MySQL一起使用


您没有声明您的DBMS,但这将无法与MySQL一起使用。

MySQL不支持检查约束,尽管

令人烦恼的是,它解析检查约束语法,但不存储约束或稍后强制执行约束。我一直认为,接受RDBMS不支持的SQL语句,甚至不报告警告,这是一种误导

要解决您的问题,您可以使用触发器:

CREATE TRIGGER t BEFORE INSERT ON mytable
FOR EACH ROW BEGIN
    IF COALESCE(NEW.email, NEW.phone_number) IS NULL THEN
        SIGNAL SQLSTATE '45000'
          SET MESSAGE_TEXT = 'Either email or phone_number must be non-null';
    END IF;
END

您还需要在更新之前定义一个类似的触发器。

MySQL不支持检查约束,尽管

令人烦恼的是,它解析检查约束语法,但不存储约束或稍后强制执行约束。我一直认为,接受RDBMS不支持的SQL语句,甚至不报告警告,这是一种误导

要解决您的问题,您可以使用触发器:

CREATE TRIGGER t BEFORE INSERT ON mytable
FOR EACH ROW BEGIN
    IF COALESCE(NEW.email, NEW.phone_number) IS NULL THEN
        SIGNAL SQLSTATE '45000'
          SET MESSAGE_TEXT = 'Either email or phone_number must be non-null';
    END IF;
END

您还需要在更新之前定义一个类似的触发器。

MySQL不支持检查约束,尽管

令人烦恼的是,它解析检查约束语法,但不存储约束或稍后强制执行约束。我一直认为,接受RDBMS不支持的SQL语句,甚至不报告警告,这是一种误导

要解决您的问题,您可以使用触发器:

CREATE TRIGGER t BEFORE INSERT ON mytable
FOR EACH ROW BEGIN
    IF COALESCE(NEW.email, NEW.phone_number) IS NULL THEN
        SIGNAL SQLSTATE '45000'
          SET MESSAGE_TEXT = 'Either email or phone_number must be non-null';
    END IF;
END

您还需要在更新之前定义一个类似的触发器。

MySQL不支持检查约束,尽管

令人烦恼的是,它解析检查约束语法,但不存储约束或稍后强制执行约束。我一直认为,接受RDBMS不支持的SQL语句,甚至不报告警告,这是一种误导

要解决您的问题,您可以使用触发器:

CREATE TRIGGER t BEFORE INSERT ON mytable
FOR EACH ROW BEGIN
    IF COALESCE(NEW.email, NEW.phone_number) IS NULL THEN
        SIGNAL SQLSTATE '45000'
          SET MESSAGE_TEXT = 'Either email or phone_number must be non-null';
    END IF;
END


您还需要在更新之前定义一个类似的触发器。

在mysql上测试过。必须更改为:
检查((电子邮件不为空)或(电话不为空))-添加了括号。在mysql上,它不起作用。该声明通过,但没有影响。它没有注册为约束,可以在同一行中添加2个null。在mysql上测试。必须更改为:
检查((电子邮件不为空)或(电话不为空))-添加了括号。在mysql上,它不起作用。该声明通过,但没有影响。它没有注册为约束,可以在同一行中添加2个null。在mysql上测试。必须更改为:
检查((电子邮件不为空)或(电话不为空))-添加了括号。在mysql上,它不起作用。该声明通过,但没有影响。它没有注册为约束,可以在同一行中添加2个null。在mysql上测试。必须更改为:
检查((电子邮件不为空)或(电话不为空))-添加了括号。在mysql上,它不起作用。该声明通过,但没有影响。它没有注册为约束,可以在同一行中添加2个空值。事实上,mysql不起作用。我认为这样的问题对于SQL来说已经足够普遍了:(知道如何在mysql中实现吗?@AlikElzin kilaka:在mysql中实现这一点的唯一(丑陋)方法是编写触发器(或升级到Postgres)奇怪的是,该命令没有失败。它只是没有做任何事情-没有创建任何约束。@AlikElzin kilaka:是的,这是MySQL的方式。它没有抛出异常,而是默默地忽略事情(或默默地截断数据)确实不适用于MySQL。我认为这样的问题对于SQL来说已经足够普遍了:(知道如何在mysql中实现吗?@AlikElzin kilaka:在mysql中实现这一点的唯一(丑陋)方法是编写触发器(或升级到Postgres)奇怪的是,该命令没有失败。它只是没有做任何事情-没有创建任何约束。@AlikElzin kilaka:是的,这是MySQL的方式。它没有抛出异常,而是默默地忽略事情(或默默地截断数据)确实不适用于MySQL。我认为这样的问题对于SQL来说已经足够普遍了:(知道如何在mysql中实现吗?@AlikElzin kilaka:在mysql中实现这一点的唯一(丑陋)方法是编写触发器(或升级到Postgres)奇怪的是,该命令没有失败。它只是没有做任何事情-没有创建任何约束。@AlikElzin kilaka:是的,这是MySQL的方式。它没有抛出异常,而是默默地忽略事情(或默默地截断数据)确实不适用于MySQL。我认为这样的问题对于SQL来说已经足够普遍了:(知道如何在mysql中实现吗?@AlikElzin kilaka:在mysql中实现这一点的唯一(丑陋)方法是编写触发器(或升级到Postgres)奇怪的是命令没有失败。它只是没有做任何事情-没有创建任何约束。@AlikElzin kilaka:是的,这是MySQL的方式。它没有抛出异常,而是默默地忽略(或默默地截断数据)有人添加了一个tsql标签,你在评论中提到了mysql。正确的标签是什么?有人添加了一个tsql标签,你在评论中提到了mysql。Wh