我有一个用户表,例如:
create table "user" (
id serial primary key,
name text not null,
superuser boolean not null default false
);
Run Code Online (Sandbox Code Playgroud)
和一个有工作的表:
create table job (
id serial primary key,
description text
);
Run Code Online (Sandbox Code Playgroud)
可以将作业分配给用户,但仅限于超级用户.其他用户无法分配作业.
所以我有一个表格,我看到哪个作业被分配给哪个用户:
create table user_has_job (
user_id integer references "user"(id),
job_id integer references job(id),
constraint user_has_job_pk PRIMARY KEY (user_id, job_id)
);
Run Code Online (Sandbox Code Playgroud)
但我想创建一个user_id引用具有的用户的检查约束user.superuser = True.
那可能吗?还是有其他解决方案吗?
所以我不能做这样的事情(仅作为一个例子):
ALTER TABLE [Customer]
ADD CONSTRAINT specify_either_phone_or_email
CHECK (([Phone] IS NOT NULL) OR ([Email] IS NOT NULL));
Run Code Online (Sandbox Code Playgroud)
这种情况有没有解决方法?
我知道:
思路
sqlite alter-table check-constraints database-schema entity-framework-core
我有这个拿出几次在我的职业生涯,并没有我的地方的同龄人似乎可以回答这个问题.说我有,有一个"描述"字段是一个候选键,但表有时用户会经由过程中途停止.因此,对于大约25%的记录,此值为null,但对于所有非NULL的记录,它必须是唯一的.
另一个例子是,必须维护多个记录的"版本"的表,和位值表示哪一个是"活动"之一.因此总是填充"候选键",但可能有三个版本相同(在活动位中为0)并且只有一个是活动的(活动位中为1).
我有其他方法来解决这些问题(在第一种情况下,在存储过程或业务层中强制执行规则代码,在第二种情况下,在需要历史记录时使用触发器和UNION表填充表) .我不想要替代方案(除非有明显更好的解决方案),我只是想知道SQL的任何风格是否能以这种方式表达"条件唯一性".我正在使用MS SQL,所以如果有办法在那里做,那很好.我大多只是在学术上对这个问题感兴趣.
sql sql-server sql-server-2005 check-constraints unique-constraint
我有一个包含4列的表(ID(PK,int,NOT NULL),col1(NULL),col2(NULL),col3(NULL))
我想添加一个CHECK约束(我认为表级别?),以便:
if col1 OR col2 are NOT NULL then col3 must be NULL
Run Code Online (Sandbox Code Playgroud)
如果col3为NOT NULL,则col1 AND col2必须为NULL
即如果col1和col2不为null,则col3应为null,反之亦然
我是SQL和SQL服务器的新手,但我不确定如何实际实现它,即使它可以/应该实现?
我想也许:
CHECK ( (col1 NOT NULL OR col2 NOT NULL AND col3 NULL) OR
(col3 NOT NULL AND col1 NULL AND col2 NULL) )
Run Code Online (Sandbox Code Playgroud)
但我不确定是否可以使用括号将这样的逻辑分组?
如果没有,如何最好地实施?
我的查询:
INSERT into PriceListRows (PriceListChapterId,[No])
SELECT TOP 250 100943 ,N'2'
FROM #AnyTable
Run Code Online (Sandbox Code Playgroud)
此查询工作正常,并根据需要引发以下异常:
INSERT语句与CHECK约束"CK_PriceListRows_RowNo_Is_Not_Unqiue_In_PriceList"冲突.冲突发生在数据库"TadkarWeb",表"dbo.PriceListRows"中.
但是更改SELECT TOP 250为SELECT TOP 251(是!只需更改250到251!),查询成功运行,没有任何检查约束异常!
为何这种奇怪的行为?
注意:
我的检查约束是一种检查某种唯一性的函数.它查询约4个表.
我检查了SQL Server 2012 SP2和SQL Server 2014 SP1
**编辑1**
检查约束函数:
ALTER FUNCTION [dbo].[CheckPriceListRows_UniqueNo] (
@rowNo nvarchar(50),
@rowId int,
@priceListChapterId int,
@projectId int)
RETURNS bit
AS
BEGIN
IF EXISTS (SELECT 1
FROM RowInfsView
WHERE PriceListId = (SELECT PriceListId
FROM ChapterInfoView
WHERE Id = @priceListChapterId)
AND (@rowID IS NULL OR Id <> @rowId)
AND No …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的Django模型:
class Dummy(models.Model):
...
system = models.CharField(max_length=16)
Run Code Online (Sandbox Code Playgroud)
我希望system永远不会是空的或包含空格.
我知道如何在Django中使用验证器.
但我会在数据库级别强制执行此操作.
为此创建数据库约束的最简单和类似django的方法是什么?
我使用PostgreSQL,不需要支持任何其他数据库.
哪些SQL数据库(如果有)支持CHECK约束中的子查询?
目前,据我所知,Oracle,MySQL和PostgreSQL都没有.
编辑
(根据初步答案澄清.)我正在寻找这样的事情:
CREATE TABLE personnel (
...,
department VARCHAR(64) NOT NULL,
salary NUMERIC NOT NULL,
CHECK (salary >= (SELECT MIN(p.salary) FROM payranges p WHERE p.dept = department)
AND
salary <= (SELECT MAX(p.salary) FROM payranges p WHERE p.dept = department)
)
Run Code Online (Sandbox Code Playgroud)
UPDATE
MS Access和Firebird都支持此功能.
我创建了一个名为testwith column 的表code:
create table test(
code char(3) not null);
Run Code Online (Sandbox Code Playgroud)
然后我用以下数据填充表格:
insert into test values ('A12');
insert into test values ('B23');
insert into test values ('C45');
Run Code Online (Sandbox Code Playgroud)
然后我改变了列以使其成为char(4):
alter table test
alter column code char(4) not null;
Run Code Online (Sandbox Code Playgroud)
然后我为所有现有数据添加了一个"X",使其变为4个字符长:
update test
set code='X'+code
where LEN(code)=3;
Run Code Online (Sandbox Code Playgroud)
到目前为止这么好但是当我尝试添加检查约束时:
alter table test
add constraint codeCheck check (code like 'A-Z''A-Z''0-9''0-9');
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
The ALTER TABLE statement conflicted with the CHECK constraint "codeCheck".
我理解错误意味着现有数据违反了我试图添加到表中的检查约束,但为什么呢?
我该怎么做才能使现有数据和检查约束不相互冲突?
如果我们有一个巨大的事实表并且想要添加一个新维度,我们可以这样做:
BEGIN TRANSACTION
ALTER TABLE [GiantFactTable]
ADD NewDimValueId INT NOT NULL
CONSTRAINT [temp_DF_NewDimValueId] DEFAULT (-1)
WITH VALUES -- table is not actually rebuilt!
ALTER TABLE [GiantFactTable]
WITH NOCHECK
ADD CONSTRAINT [FK_GiantFactTable_NewDimValue]
FOREIGN KEY ([NewDimValueId])
REFERENCES [NewDimValue] ([Id])
-- drop the default constraint, new INSERTs will specify a value for NewDimValueId column
ALTER TABLE [GiantFactTable]
DROP CONSTRAINT [temp_DF_NewDimValueId]
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
注意:以上所有内容仅操纵表元数据,无论表大小如何都应该快速.然后我们可以运行一个工作来回填GiantFactTable.NewDimValueId小事务,这样就不会违反FK.(此时任何INSERT/UPDATE - 例如回填操作 - 都由FK验证,因为它已启用,但不是"可信")
在回填之后,我们知道数据是一致的,我的问题是SQL引擎如何变得开明?不使表离线.
此命令将使FK受信任,但它需要架构修改(Sch-M)锁定并且可能需要数小时(几天?)使表离线:
ALTER TABLE [GiantFactTable]
WITH CHECK CHECK CONSTRAINT [FK_GiantFactTable_NewDimValue]
Run Code Online (Sandbox Code Playgroud)
关于工作负载:表有几百个分区(固定数量),数据一次附加到一个分区(以循环方式),从不删除.还有一个恒定的读取工作负载,它使用群集密钥一次从一个分区获取(相对较小的)行范围.一次检查一个分区,使其脱机,是可以接受的.但我找不到任何语法来做到这一点.还有其他想法吗?
sql sql-server foreign-keys check-constraints sql-server-2012
我有一个有三个字段的表,比如a,b,c.我想添加一个约束,确保如果a不为null,那么b和c也不为null.我使用以下SQL完成了这项工作
ALTER TABLE sample
ADD CONSTRAINT no_nulls
CHECK (CASE WHEN a IS NOT NULL THEN b IS NOT NULL AND c IS NOT NULL END)
Run Code Online (Sandbox Code Playgroud)
有没有办法使用hibernate注释实现相同的效果@Check?
我找不到这个注释的有用示例,开发人员往往根本不使用它吗?
sql ×7
sql-server ×4
foreign-keys ×2
postgresql ×2
alter-table ×1
django ×1
hibernate ×1
java ×1
jpa ×1
sqlite ×1
subquery ×1
t-sql ×1