标签: check-constraints

编写CHECK CONSTRAINT的一种更好的方法,它检查确切的一个值不为null

想象一下,我有一个包含整数列Col1,Col2,Col3,Col4的表.每列都是可空的,并且有效行必须包含恰好1列的值(即所有空值无效且多于1列也无效).

目前我有这样的检查约束

ALTER TABLE [dbo].[MyTable]  WITH CHECK 
    ADD CONSTRAINT [CK_ReportTemplateAttributes] CHECK  
    ((
        [Col1] IS NOT NULL AND [Col2] IS NULL AND [Col3] IS NULL AND [Col4] IS NULL
        OR 
        [Col1] IS NULL AND [Col2] IS NOT NULL AND [Col3] IS NULL AND [Col4] IS NULL
        OR 
        [Col1] IS NULL AND [Col2] IS NULL AND [Col3] IS NOT NULL AND [Col4] IS NULL
        OR 
        [Col1] IS NULL AND [Col2] IS NULL AND [Col3] IS NULL AND [Col4] IS NOT NULL
    )); …
Run Code Online (Sandbox Code Playgroud)

sql sql-server check-constraints

5
推荐指数
2
解决办法
1609
查看次数

如何使用 Spring JPA 声明 CHECK 约束?

怎么可能知道支持哪些数据注释Spring JPA

例如,是否@Min支持?

   @Min(value = 0)
   private double calories;
Run Code Online (Sandbox Code Playgroud)

无论如何,如何声明CHECK约束?

更新

请阅读有关CHECK 约束的信息。另请注意,这@Min是一个超链接。

java spring jpa check-constraints spring-data-jpa

5
推荐指数
1
解决办法
5306
查看次数

在 CHECK 约束中使用子查询的替代方法?

我正在尝试构建一个简单的酒店房间登记数据库作为学习练习。

CREATE TABLE HotelReservations
(
    roomNum INTEGER NOT NULL,
    arrival DATE NOT NULL,
    departure DATE NOT NULL,
    guestName CHAR(30) NOT NULL,

    CONSTRAINT timeTraveler CHECK (arrival < departure) /* stops time travelers*/
    /* CONSTRAINT multipleReservations CHECK (my question is about this) */

    PRIMARY KEY (roomNum, arrival)
);
Run Code Online (Sandbox Code Playgroud)

我无法指定不允许为尚未腾出的房间插入新预订的约束。例如(下图),客人 'B' 在 'A' 退房之前入住 123 房间。

INSERT INTO HotelStays(roomNum, arrival, departure, guestName)
VALUES 
    (123, date("2017-02-02"), date("2017-02-06"), 'A'),
    (123, date("2017-02-04"), date("2017-02-08"), 'B');
Run Code Online (Sandbox Code Playgroud)

这不应该被允许,但我不确定如何编写此约束。我的第一次尝试是编写一个子查询检查,但我无法找出正确的子查询,因为我不知道如何访问新插入的 'roomNum' 值来执行子查询。然后我还发现大多数 SQL 系统甚至不允许在 check 内部进行子查询。

那么我应该如何写这个约束呢?我读了一些关于触发器的文章,它们似乎可以解决这个问题,但这真的是唯一的方法吗?或者我只是密集而缺少编写约束的明显方法?

sqlite triggers subquery check-constraints relational-database

5
推荐指数
1
解决办法
3545
查看次数

何时评估检查约束?

我有一张记录表

ID
EntityID 
Value
Status
Run Code Online (Sandbox Code Playgroud)

和实体表

ID
Col1
Col2
CurrentRecordID
Run Code Online (Sandbox Code Playgroud)

CurrentRecordID应的Record绑在EntityStatus0

我有表两个检查约束之一Entity是检查,以确保CurrentRecordID实际上是对当前记录,一个Record是检查,以确保,如果它具有为0的状态,它EntityIDCurrentRecordID它的ID相符。

所以本质上,这两个检查约束做同样的事情,但分别在每个表上

检查约束是在事务的最后运行还是在表上每次插入/更新后像触发器一样运行?

如果它们在每次修改后运行,这两个约束是否会相互冲突(意味着,约束将在下一个表有机会更新其值之前抛出错误)。

这是运行以插入新记录并将其设置为给定实体的当前查询的示例

UPDATE Record SET Status = 1 WHERE Status = 0 AND EntityID = @EntityID
INSERT INTO Record(EntityID, Value, Status) VALUES(@EntityID, 100, 0)
DECLARE @RecordID INT = @@IDENTITY
UPDATE Entity SET CurrentRecordID = RecordID WHERE ID = @EntityID
Run Code Online (Sandbox Code Playgroud)

sql-server check-constraints

5
推荐指数
1
解决办法
1809
查看次数

MySQL - 在多列上一起创建非空表

无论如何要创建一个包含多列的表,其中 2 个在同一记录中永远不应该为空。

例如,我需要以某种方式制作C,如果另一个不在同一记录中D,它们中的每一个都可能是。nullnull

我有什么办法吗?

| A | B | C | D | E |
|---|---|---|---|---|
|   |   |   |   |   |
|   |   |   |   |   |
|   |   |   |   |   |
Run Code Online (Sandbox Code Playgroud)

他们永远不应该在一起有价值

mysql sql database check-constraints

5
推荐指数
1
解决办法
498
查看次数

Django CheckConstraint:反向外键查找的元素不能为空

我有这些模型:

class Container(models.Model):
    ...
    class Meta:
        constraints = [
            models.CheckConstraint(
                 check=~Q(elements=None),
                 name='container_must_have_elements'
            ),
        ]

class Element(models.Model):
    container = models.ForeignKey(Container),
        related_name='elements',
        on_delete=models.CASCADE
    )
Run Code Online (Sandbox Code Playgroud)

我想强制每个Container对象必须至少有一个Element通过外键关系引用它的约束。

如您所见,我已经添加了一个检查约束。但是,对象~上的否定运算符Q似乎是被禁止的。django.db.utils.NotSupportedError: cannot use subquery in check constraint当我尝试应用生成的迁移时,我得到了。

如果没有否定运算符,约束似乎是有效的(它只会由于数据完整性错误而失败)。

有没有另一种方法可以表达这个约束,以便它支持CheckConstraint?(例如,有没有办法检查集合是否elements为空?)

django django-models check-constraints django-orm django-q

5
推荐指数
1
解决办法
989
查看次数

是否不可能有一个检查约束引用一个也有外键的列?

我在 MySQL 8 上尝试添加检查约束:

ALTER TABLE `table` ADD CHECK (
    (`column_a` IS NULL AND `column_b` IS NOT NULL) OR
    (`column_a` IS NOT NULL AND `column_b` IS NULL)
);
Run Code Online (Sandbox Code Playgroud)

但我不断收到此错误

列“column_b”不能用于检查约束“table_chk_1”:需要在外键约束“table_ibfk_2”引用操作中使用。

我在互联网上的其他任何地方都找不到对此错误的任何参考,我不明白问题是什么。无论column_acolumn_b也的外键与其它表,他们都是空。我只想确保中的每一行table都有一个引用 viacolumn_a或 via column_b

这个错误的原因是什么?


我试过什么

我试图删除外键,添加检查约束并成功。然后,如果我将外键添加回,column_b我仍然会收到相同的错误。

mysql sql check-constraints create-table mysql-8.0

5
推荐指数
1
解决办法
463
查看次数

如何在MSSQL中的VARCHAR列上创建CHECK约束,指定可能出现在数据中的有效字符集?

我在Microsoft SQL数据库中有一个代表用户名的VARCHAR(30)列.我想添加一个CHECK约束,它只允许使用一定范围的字符:特别是az,AZ,下划线和破折号.我必须使用什么表达方式?

sql t-sql sql-server check-constraints

4
推荐指数
1
解决办法
2061
查看次数

SQLite长臂检查约束?

我在SQLite中有两个表,对一对多关系进行建模:

CREATE TABLE parent (
    id INTEGER PRIMARY KEY,
    payload TEXT
);

CREATE TABLE child (
    id INTEGER PRIMARY KEY,
    flag BOOLEAN,
    parent_id INTEGER,
    FOREIGN KEY(parent_id) REFERENCES parent (id) ON DELETE CASCADE ON UPDATE CASCADE, 
);
Run Code Online (Sandbox Code Playgroud)

有没有把一个办法CHECK CONSTRAINTchild.flag,所以总有一个且只有一个True在所有child任何parent

sql sqlite check-constraints

4
推荐指数
1
解决办法
104
查看次数

为什么 postgres `CHECK` 约束中不能使用 `IF` 子句?

例如这个查询可能吗?

CREATE TABLE products (
    name text,
    price numeric not null,
    CHECK (IF price > 0 THEN name IS NOT NULL ELSE name IS NULL END IF)
);
Run Code Online (Sandbox Code Playgroud)

更新:

好像没有

这里https://rextester.com/l/postgresql_online_compiler

它抛出错误

Error(s), warning(s):

42601: syntax error at or near "price"
Run Code Online (Sandbox Code Playgroud)

查看文档https://www.postgresql.org/docs/current/sql-createtable.html#SQL-CREATETABLE-EXCLUDE它说

目前,CHECK 表达式不能包含子查询,也不能引用除当前行的列之外的变量。可以引用系统列 tableoid,但不能引用任何其他系统列。

IF不是子查询,不明白为什么它不起作用


更新2:

CREATE TABLE products (
    name text,
    price numeric not null,
    CHECK ((price > 0 AND name IS NOT NULL) OR (price <= 0 AND name IS NULL)) …
Run Code Online (Sandbox Code Playgroud)

postgresql ddl check-constraints

4
推荐指数
1
解决办法
1521
查看次数