Php mySQL插入,同时确保特定列有一个;是”;“价值与剩余”;否";

Php mySQL插入,同时确保特定列有一个;是”;“价值与剩余”;否";,php,sql,insert,unique,Php,Sql,Insert,Unique,我有一个表:event_list,有两列:名称为var(80),默认为ENUM('y','n') 其思想是一次只能有一个事件设置为默认事件。因此,如果表中有100个事件,其中99个事件的默认值必须为'n',另一个事件的默认值必须为'y' 当客户向系统添加新事件时,有一个选项“将此事件设为默认”。我要做的是将事件插入表中。如果插入的默认列被添加为“y”,我需要一种简单的方法将所有其余的默认行更改为“n” mySQL有没有办法处理这个问题?如果用户设置了新的默认值,我是否必须手动将所有其他数据字段更

我有一个表:event_list,有两列:名称为var(80),默认为ENUM('y','n')

其思想是一次只能有一个事件设置为默认事件。因此,如果表中有100个事件,其中99个事件的默认值必须为'n',另一个事件的默认值必须为'y'

当客户向系统添加新事件时,有一个选项“将此事件设为默认”。我要做的是将事件插入表中。如果插入的默认列被添加为“y”,我需要一种简单的方法将所有其余的默认行更改为“n”


mySQL有没有办法处理这个问题?如果用户设置了新的默认值,我是否必须手动将所有其他数据字段更改为“n”?

我建议更改当前表以包含ID(唯一、自动增量)字段,并删除枚举字段,然后添加一个存储默认事件ID的新表。然后您只需要编辑一行。

我建议更改当前表以包含ID(唯一、自动增量)字段,删除枚举字段,然后添加一个存储默认事件ID的新表。然后您只需要编辑一行。

您可以使用触发器来管理它。 否则,在插入之前,您必须更新所有记录以将状态设置为“n”


编辑:SenorAmor的答案看起来更好

您可以使用触发器来管理它。 否则,在插入之前,您必须更新所有记录以将状态设置为“n”


编辑:SenorAmor的答案看起来更好

创建
存储过程如何

DELIMITER $$
CREATE PROCEDURE SetCurrentEvent(IN oEventName varchar(50))
BEGIN
     UPDATE `event_list` SET `default` = 'N';
     UPDATE `event_list` SET `default` = 'Y' WHERE `name` = oEventName;
END$$
DELIMITER ;
因此,通过创建它,您可以简单地使用:

CALL SetCurrentEvent('qwwrty');

创建
存储过程如何

DELIMITER $$
CREATE PROCEDURE SetCurrentEvent(IN oEventName varchar(50))
BEGIN
     UPDATE `event_list` SET `default` = 'N';
     UPDATE `event_list` SET `default` = 'Y' WHERE `name` = oEventName;
END$$
DELIMITER ;
因此,通过创建它,您可以简单地使用:

CALL SetCurrentEvent('qwwrty');

可能需要重新编译…可能需要重新编译…在新表中,您可能需要创建约束以确保表中只有一行。例如,create table defind(default_id int not null外键引用yourT(id),enforcer int not null unique default(0)check(enforcer=0))如果在主表中使用“y”和null而不是“y”和“n”,则也可以在没有其他表的情况下使用相同类型的约束来执行此操作。请注意,这两种解决方案(也不是SenorAmor保证存在标记为默认事件的事件。我太傻了!这很有道理,我本该这么想。非常感谢!@SteveKass:当然没有(声明性的)确保存在标记为默认事件的事件的方法。好的,现在我只需要弄清楚如何插入到我的event_列表表中,并使用最近插入行的id更新到event_默认表。在新表中,您可能需要创建约束以确保表中只有一行。对于例如,创建表DefID(默认值\u id int not null外键引用yourT(id),enforcer int not null唯一默认值(0)检查(enforcer=0))。如果在主表中使用“y”和“null”而不是“y”和“n”,则也可以在没有其他表的情况下使用相同类型的约束来执行此操作。请注意,这两种解决方案都不是(也不是SenorAmor保证有一个事件被标记为默认事件。我太傻了!这很有道理,我应该这么想。非常感谢!@SteveKass:当然没有(声明性的)确保有一个标记为默认事件的事件的方法。好的,现在我只需要弄清楚如何插入到我的event_列表表中,并用最近插入的行的id更新到event_默认表。这实际上非常好。我要注意这项技术。虽然我想这次我要采用新的表格理念。这实际上非常好。我会注意到这项技术。尽管我认为这次我会采用新的表格理念。