Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用通配符值时的SQL唯一性约束_Sql Server_Constraints - Fatal编程技术网

Sql server 使用通配符值时的SQL唯一性约束

Sql server 使用通配符值时的SQL唯一性约束,sql-server,constraints,Sql Server,Constraints,考虑下表,其中规定了在一周中的特定日期禁止食用的水果DayOfWeek可以为NULL,其中NULL表示一周中的所有日子都禁止这种水果 Fruit DayOfWeek ---------------------- Kiwi NULL Apples Monday Strawberries Monday Oranges Tuesday Bananas Wednesday Pineapple Thursday 是否可以在此表上实现一个

考虑下表,其中规定了在一周中的特定日期禁止食用的水果
DayOfWeek
可以为NULL,其中NULL表示一周中的所有日子都禁止这种水果

Fruit        DayOfWeek
----------------------
Kiwi         NULL
Apples       Monday
Strawberries Monday
Oranges      Tuesday
Bananas      Wednesday
Pineapple    Thursday
是否可以在此表上实现一个约束,防止我插入值
(Kiwi,星期一)
,因为现有的
(Kiwi,NULL)
行已在星期一(和每隔一天)禁止Kiwi

最好在不使用触发器的情况下执行此操作。

尝试此链接

对于MySQL,您可以设置唯一的约束。

尝试此链接


对于MySQL,您可以设置唯一的限制。

我个人不喜欢NULL表示所有的想法,但将其更改为在NULL可能超出范围的情况下每天包含一行


如果触发器不是一个选项,我将查看检查约束并设置一个函数来测试您试图避免的条件

我个人不喜欢NULL表示所有,但将其更改为在NULL可能超出范围的情况下每天包含一行


如果触发器不是一个选项,我将查看检查约束并设置一个函数来测试您试图避免的条件

除非你有很好的理由,否则你不应该改变NULL的含义。Null反映了一个未知的值,所以我会读这篇文章,因为我们不知道猕猴桃是在哪一天被禁止的。然后,您可以更改逻辑,为禁止使用猕猴桃的一周中的每一天存储一个记录

如果你需要写一个查询,上面写着周一给我所有禁果怎么办。您需要将查询编写为

在DayOfWeek='Monday'| | DayOfWeek为空的坏水果中选择*


一个更有效、更容易理解的查询将消除or子句。

除非您有很好的理由,否则不应更改NULL的含义。Null反映了一个未知的值,所以我会读这篇文章,因为我们不知道猕猴桃是在哪一天被禁止的。然后,您可以更改逻辑,为禁止使用猕猴桃的一周中的每一天存储一个记录

如果你需要写一个查询,上面写着周一给我所有禁果怎么办。您需要将查询编写为

在DayOfWeek='Monday'| | DayOfWeek为空的坏水果中选择*


一个更有效、更容易理解的查询将消除or子句。

我同意其他人的看法,我可能会选择一种不同于您展示的车型,但如果您购买该车型,那么以下几点似乎可以满足您的需求:

create table dbo.Weekdays (
    DayOfWeek varchar(10) not null,
    constraint PK_Weekdays PRIMARY KEY (DayOfWeek)
)
go
create table dbo.Exclusions (
    Fruit varchar(20) not null,
    DayOfWeek varchar(10) null,
    /* PK? */
    constraint FK_Exclusions FOREIGN KEY (DayOfWeek) references Weekdays (DayOfWeek)
)
不确定排除表的主键应该是什么,从您所展示的内容来看不明显,但它的目的是作为您的表。我们需要引入
Weekdays
表以使后面的视图工作*。现在填充它:

insert into dbo.Weekdays (DayOfWeek)
select 'Monday' union all
select 'Tuesday' union all
select 'Wednesday' union all
select 'Thursday' union all
select 'Friday' union all
select 'Saturday' union all
select 'Sunday'
以及您的示例数据:

insert into dbo.Exclusions (Fruit,DayOfWeek)
select 'Kiwi',NULL union all
select 'Apples','Monday' union all
select 'Strawberries','Monday' union all
select 'Oranges','Tuesday' union all
select 'Bananas','Wednesday' union all
select 'Pineapple','Thursday'
现在,我们创建视图以实现约束:

create view dbo.Exclusions_NullExpanded
with schemabinding
as
    select
        e.Fruit,
        wd.DayOfWeek
    from
        dbo.Exclusions e
            inner join
        dbo.Weekdays wd
            on
                e.DayOfWeek = wd.DayOfWeek or
                e.DayOfWeek is null
go
create unique clustered index IX_Exclusions_NoDups on dbo.Exclusions_NullExpanded (Fruit,DayOfWeek)
如果我们尝试插入您不希望插入的行:

insert into dbo.Exclusions (Fruit,DayOfWeek)
select 'Kiwi','Monday'
我们得到:

Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.Exclusions_NullExpanded' with unique index 'IX_Exclusions_NoDups'.
The statement has been terminated.

*我最初尝试在不引入
Weekdays
表的情况下实现这一点,并将其作为文本行的子集内联显示在视图定义中。但是你不能创建一个索引来强制我们在这样一个视图上想要的约束。

我同意其他人的观点,我可能会选择一个不同于你展示的模型,但是如果你已经购买了它,那么下面的内容似乎可以满足你的需要:

create table dbo.Weekdays (
    DayOfWeek varchar(10) not null,
    constraint PK_Weekdays PRIMARY KEY (DayOfWeek)
)
go
create table dbo.Exclusions (
    Fruit varchar(20) not null,
    DayOfWeek varchar(10) null,
    /* PK? */
    constraint FK_Exclusions FOREIGN KEY (DayOfWeek) references Weekdays (DayOfWeek)
)
不确定排除表的主键应该是什么,从您所展示的内容来看不明显,但它的目的是作为您的表。我们需要引入
Weekdays
表以使后面的视图工作*。现在填充它:

insert into dbo.Weekdays (DayOfWeek)
select 'Monday' union all
select 'Tuesday' union all
select 'Wednesday' union all
select 'Thursday' union all
select 'Friday' union all
select 'Saturday' union all
select 'Sunday'
以及您的示例数据:

insert into dbo.Exclusions (Fruit,DayOfWeek)
select 'Kiwi',NULL union all
select 'Apples','Monday' union all
select 'Strawberries','Monday' union all
select 'Oranges','Tuesday' union all
select 'Bananas','Wednesday' union all
select 'Pineapple','Thursday'
现在,我们创建视图以实现约束:

create view dbo.Exclusions_NullExpanded
with schemabinding
as
    select
        e.Fruit,
        wd.DayOfWeek
    from
        dbo.Exclusions e
            inner join
        dbo.Weekdays wd
            on
                e.DayOfWeek = wd.DayOfWeek or
                e.DayOfWeek is null
go
create unique clustered index IX_Exclusions_NoDups on dbo.Exclusions_NullExpanded (Fruit,DayOfWeek)
如果我们尝试插入您不希望插入的行:

insert into dbo.Exclusions (Fruit,DayOfWeek)
select 'Kiwi','Monday'
我们得到:

Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.Exclusions_NullExpanded' with unique index 'IX_Exclusions_NoDups'.
The statement has been terminated.

*我最初尝试在不引入
Weekdays
表的情况下实现这一点,并将其作为文本行的子集内联显示在视图定义中。但您无法创建对此类视图强制执行约束的索引。

Unique在此处不起作用,因为KIWI、NULL和KIWI、Monday(每操作无效)都可用于Unique。Unique在此处不起作用,因为KIWI、NULL和KIWI、Monday(每操作无效)都可用于Unique。这不是唯一性约束,这只是一个业务规则。这不是唯一性约束,它只是一个业务规则。检查约束可以验证所有行的条件吗?我有一种印象,CHECK约束只能基于单个行中的数据列计算其逻辑。如果从约束调用的函数计算表,则可以这样做。我的偏好仍然是输入的触发器,因为它不会弄脏水,所以我可能应该让jsut声明这一点,让它去做。检查约束可以验证所有行的条件吗?我有一种印象,CHECK约束只能基于单个行中的数据列计算其逻辑。如果从约束调用的函数计算表,则可以这样做。我的偏好仍然是输入的一个触发器,因为它不会搅浑水体,所以我可能应该让jsut声明这一点,让它去做。