想象一下,我有一个包含整数列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) 怎么可能知道支持哪些数据注释Spring JPA?
例如,是否@Min支持?
@Min(value = 0)
private double calories;
Run Code Online (Sandbox Code Playgroud)
无论如何,如何声明CHECK约束?
更新
请阅读有关CHECK 约束的信息。另请注意,这@Min是一个超链接。
我正在尝试构建一个简单的酒店房间登记数据库作为学习练习。
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
我有一张记录表
ID
EntityID
Value
Status
Run Code Online (Sandbox Code Playgroud)
和实体表
ID
Col1
Col2
CurrentRecordID
Run Code Online (Sandbox Code Playgroud)
CurrentRecordID应的Record绑在Entity与Status0
我有表两个检查约束之一Entity是检查,以确保CurrentRecordID实际上是对当前记录,一个Record是检查,以确保,如果它具有为0的状态,它EntityID有CurrentRecordID它的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) 无论如何要创建一个包含多列的表,其中 2 个在同一记录中永远不应该为空。
例如,我需要以某种方式制作C,如果另一个不在同一记录中D,它们中的每一个都可能是。nullnull
我有什么办法吗?
| A | B | C | D | E |
|---|---|---|---|---|
| | | | | |
| | | | | |
| | | | | |
Run Code Online (Sandbox Code Playgroud)
他们永远不应该在一起有价值
我有这些模型:
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为空?)
我在 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_a和column_b也的外键与其它表,他们都是空。我只想确保中的每一行table都有一个引用 viacolumn_a或 via column_b。
这个错误的原因是什么?
我试图删除外键,添加检查约束并成功。然后,如果我将外键添加回,column_b我仍然会收到相同的错误。
我在Microsoft SQL数据库中有一个代表用户名的VARCHAR(30)列.我想添加一个CHECK约束,它只允许使用一定范围的字符:特别是az,AZ,下划线和破折号.我必须使用什么表达方式?
我在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 CONSTRAINT上child.flag,所以总有一个且只有一个True在所有child任何parent?
例如这个查询可能吗?
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) sql ×5
sql-server ×3
mysql ×2
sqlite ×2
create-table ×1
database ×1
ddl ×1
django ×1
django-orm ×1
django-q ×1
java ×1
jpa ×1
mysql-8.0 ×1
postgresql ×1
spring ×1
subquery ×1
t-sql ×1
triggers ×1