gpt4 book ai didi

mysql - SQL - 只允许插入三列之一(但必须设置一列)

转载 作者:行者123 更新时间:2023-11-29 06:17:04 26 4
gpt4 key购买 nike

假设我有一个包含这些列的表:

id | name | foo_id | bar_id | foobar_id
---------------------------------------

我想做一个约束,所以至少必须设置“foo_id”、“bar_id”或“foobar_id”列中的一个。但是,必须设置这三个列中的一个

使用 SQL 约束是否可能?

“名称”(以及任何其他可能的列)必须不受约束的影响

最佳答案

问题是您的数据库设计不当。当数据库设计不当时,就会出现这些问题。以下是我如何处理这些关系的设计:

CREATE TABLE Child (
child_id INT NOT NULL,
child_type INT NOT NULL, -- 1 = Foo, 2 = Bar, 3 = Foobar
CONSTRAINT PK_Child PRIMARY KEY CLUSTERED (child_id, child_type),
CONSTRAINT UI_Child_childid UNIQUE (child_id)
)

CREATE TABLE My_Table (
id INT NOT NULL,
name VARCHAR(20) NOT NULL,
child_id INT NOT NULL,
CONSTRAINT PK_My_Table PRIMARY KEY CLUSTERED (id),
CONSTRAINT FK_Child_MyTable FOREIGN KEY (child_id, child_type) REFERENCES Child (child_id, child_type)
)

CREATE TABLE Foo (
child_id INT NOT NULL,
child_type INT NOT NULL, -- Always = 1
some_foo_column VARCHAR(20) NOT NULL,
CONSTRAINT PK_Foo PRIMARY KEY CLUSTERED (child_id),
CONSTRAINT FK_Foo_Child FOREIGN KEY (child_id, child_type) REFERENCES Child (child_id, child_type)
)

CREATE TABLE Bar (
child_id INT NOT NULL,
child_type INT NOT NULL, -- Always = 2
some_bar_column VARCHAR(20) NOT NULL,
CONSTRAINT PK_Bar PRIMARY KEY CLUSTERED (child_id),
CONSTRAINT FK_Bar_Child FOREIGN KEY (child_id, child_type) REFERENCES Child (child_id, child_type)
)

CREATE TABLE Foo_Bar (
child_id INT NOT NULL,
child_type INT NOT NULL, -- Always = 3
some_foo_bar_column VARCHAR(20) NOT NULL,
CONSTRAINT PK_Foo_Bar PRIMARY KEY CLUSTERED (child_id),
CONSTRAINT FK_Foo_Bar_Child FOREIGN KEY (child_id, child_type) REFERENCES Child (child_id, child_type)
)

当然,Child表的命名应该有意义,而不仅仅是“Child”。

这强制 My_Table 只能有一个 child_id 并且它必须至少有一个 - 换句话说,只有一个。

通过将 child_type 作为 Child 表的主键的一部分并将其用作所有子表的外键的一部分,您可以强制执行Child 表中的每个 ID 在每个子表中只存在一次。

我主要使用 MS SQL Server,所以如果这些语法中的某些部分不适用于 MySQL,我深表歉意,但这个想法是重要的部分,所有部分都可以在 MySQL 中实现——它支持 PK、FK 和独特的约束。

关于mysql - SQL - 只允许插入三列之一(但必须设置一列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35272374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com