Mysql 如何定义列a或列b不为空?

Mysql 如何定义列a或列b不为空?,mysql,sql,check-constraints,Mysql,Sql,Check Constraints,我想知道是否可以为列名称或列姓氏创建非空约束。例: create table football_players ( id VARCHAR(36) PRIMARY KEY, name VARCHAR(20), surname VARCHAR(20) ); 有时我们知道名字或姓氏,但不是两者都知道。我不希望数据库中没有名字的播放器。标准SQL方法是: create table football_players ( id VARCHAR(36) PRIMARY KEY

我想知道是否可以为列
名称
或列
姓氏
创建非空约束。例:

create table football_players (
    id VARCHAR(36) PRIMARY KEY,
    name VARCHAR(20),
    surname VARCHAR(20)
);

有时我们知道名字或姓氏,但不是两者都知道。我不希望数据库中没有名字的播放器。

标准SQL方法是:

create table football_players (
    id VARCHAR(36) PRIMARY KEY,
    name VARCHAR(20),
    surname VARCHAR(20),
    constraint chk_name_surname check (name is not null or surname is not null)
);

这在MySQL中不起作用(问题最初没有标记为MySQL)。在MySQL中执行此操作需要触发器。

如果我理解正确:

您可以询问PHP中要加载的任何数据是否为空。例如:

If (!isset($name)) {
    //code sql
}
else if (!isset($lastname)){
    //code sql
}
else {
    //code sql
}
以及更改表格:

alter table TABLENAME modify FIELD varchar(40) not null default ''
或者您可以选择“不为空”:

SELECT LastName,FirstName FROM tablename
WHERE LastName IS NOT NULL

MySQL不支持检查约束,但您可以做类似的事情。

问题的答案严格取决于您使用的确切RDBMS。它是什么?SQL Server、MySQL、Oracle、其他一些DBMS?@Andy Korneyev MySQLYou不能在MySQL中这样做-它仍然不支持检查约束(尽管它不会告诉您),您可能还想检查空字符串。对于大多数人来说,空字符串也不是“有效”名称。是的,我尝试过,但当我在mysql上测试它时,我可以为名称和姓氏输入null。@罗宾逊:这是因为mysql仍然不支持检查约束。
DELIMITER//CREATE TRIGGER TRIGGER\u players\u name\u not null,然后在插入每行的players之前开始声明dummy,baddata INT;设置baddata=0;如果NEW.name为null,NEW.lasname为null,则设置baddata=1;如果结束;如果baddata=1,则从信息_schema.tables中选择CONCAT('无法插入此项,因为Age',NEW.name,NEW.nam姓氏'无效');如果结束;结束//分隔符
DELIMITER //
CREATE TRIGGER trigger_players_name_not_null BEFORE INSERT ON players
   FOR EACH ROW BEGIN
   DECLARE dummy,baddata INT;
   SET baddata = 0;
      IF NEW.name is null and NEW.surname is null THEN SET baddata = 1;
      END IF;
      IF baddata = 1 THEN
         SELECT CONCAT('Cannot Insert This Because Age ',NEW.name, NEW.surname,' are Invalid')
         INTO dummy FROM information_schema.tables;
      END IF;
END
//
DELIMITER ;