标签: check-constraints

PostgreSQL检查外键条件的约束

我有一个用户表,例如:

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.

那可能吗?还是有其他解决方案吗?

sql postgresql foreign-keys check-constraints

13
推荐指数
2
解决办法
6746
查看次数

向现有SQLite表添加约束

我正在使用SQLite,它不支持向现有表添加约束.

所以我不能做这样的事情(仅作为一个例子):

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)

这种情况有没有解决方法?

我知道:

  • 我可以为新表添加约束,但它不是新的(它由我的ORM,EF Core生成)
  • 我可以做一个"表重建"(重命名表,创建新表,复制旧数据,删除临时表)但这看起来真的很复杂

思路

  • 我可以以某种方式将表的副本复制到新表中,并进行一些架构更改吗?
  • 或以某种方式"获取"模式,并在SQL脚本中编辑它,然后添加具有该模式的表?

sqlite alter-table check-constraints database-schema entity-framework-core

12
推荐指数
1
解决办法
4938
查看次数

SQL我可以在表上有一个"条件唯一"约束吗?

我有这个拿出几次在我的职业生涯,并没有我的地方的同龄人似乎可以回答这个问题.说我有,有一个"描述"字段是一个候选键,但表有时用户会经由过程中途停止.因此,对于大约25%的记录,此值为null,但对于所有非NULL的记录,它必须是唯一的.

另一个例子是,必须维护多个记录的"版本"的表,和位值表示哪一个是"活动"之一.因此总是填充"候选键",但可能有三个版本相同(在活动位中为0)并且只有一个是活动的(活动位中为1).

我有其他方法来解决这些问题(在第一种情况下,在存储过程或业务层中强制执行规则代码,在第二种情况下,在需要历史记录时使用触发器和UNION表填充表) .我不想要替代方案(除非有明显更好的解决方案),我只是想知道SQL的任何风格是否能以这种方式表达"条件唯一性".我正在使用MS SQL,所以如果有办法在那里做,那很好.我大多只是在学术上对这个问题感兴趣.

sql sql-server sql-server-2005 check-constraints unique-constraint

10
推荐指数
1
解决办法
2万
查看次数

CHECK约束可以像其他一样吗?

我有一个包含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)

但我不确定是否可以使用括号将这样的逻辑分组?

如果没有,如何最好地实施?

sql sql-server check-constraints

9
推荐指数
2
解决办法
2万
查看次数

对于超过250条记录的批量插入,检查约束不起作用

我的查询:

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 250SELECT TOP 251(是!只需更改250到251!),查询成功运行,没有任何检查约束异常!

为何这种奇怪的行为?

注意:

  1. 我的检查约束是一种检查某种唯一性的函数.它查询约4个表.

  2. 我检查了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)

t-sql sql-server check-constraints user-defined-functions

9
推荐指数
1
解决办法
676
查看次数

通过Django创建数据库约束

我有一个看起来像这样的Django模型:

class Dummy(models.Model):
    ...
    system = models.CharField(max_length=16)
Run Code Online (Sandbox Code Playgroud)

我希望system永远不会是空的或包含空格.

我知道如何在Django中使用验证器.

但我会在数据库级别强制执行此操作.

为此创建数据库约束的最简单和类似django的方法是什么?

我使用PostgreSQL,不需要支持任何其他数据库.

django postgresql check-constraints

9
推荐指数
3
解决办法
2731
查看次数

哪些SQL数据库支持CHECK约束中的子查询?

哪些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都支持此功能.

sql subquery check-constraints

8
推荐指数
1
解决办法
1万
查看次数

将CHECK约束添加到已填充的表中

我创建了一个名为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".

我理解错误意味着现有数据违反了我试图添加到表中的检查约束,但为什么呢?

我该怎么做才能使现有数据和检查约束不相互冲突?

sql check-constraints sql-server-2008-r2

8
推荐指数
1
解决办法
2万
查看次数

检查外键约束"在线"

如果我们有一个巨大的事实表并且想要添加一个新维度,我们可以这样做:

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

8
推荐指数
1
解决办法
1404
查看次数

Hibernate Check Annotation

我有一个有三个字段的表,比如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?

我找不到这个注释的有用示例,开发人员往往根本不使用它吗?

java sql hibernate jpa check-constraints

8
推荐指数
1
解决办法
7038
查看次数