Mysql 如何在SQL中定义一个表,其中有两个字段不依赖于null(必需)?
Not null dependent表示至少有1个字段不为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方言允许或要求您
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