标签: check-constraints

使SQL Server仅在插入或更新的行上使用CHECK CONSTRAINT

我想将业务规则应用于表中的行(SQL Server 2008).但是,表中的历史数据不符合此规则,并且没有好的方法使其符合(没有合理默认值的未知值.)所以我希望在新插入时检查CHECK CONSTRAINT 行,或更新行时.

我创建了这样一个约束,并设置以下值:

  • 在创建或重新启用时检查现有数据:否
  • 强制执行INSERT和UPDATE:是的
  • 强制复制:是的

插入新记录时,一切似乎都很好.但是,如果我更新记录,即使更新的记录符合CHECK CONSTRAINT,CHECK CONSTRAINT也会失败.就好像它正在尝试在更新单行时将约束应用于所有行.我怎么能阻止这个?

这是约束:

([DateGiven] IS NULL 
 AND [PrimaryConsultantId] IS NULL 
 AND [AdditionalConsultants] IS NULL 
 AND [ResultingClaLevel] IS NULL)
OR ([DateGiven] IS NOT NULL 
 AND [PrimaryConsultantId] IS NOT NULL 
 AND [AdditionalConsultants] IS NOT NULL 
 AND [ResultingClaLevel] IS NOT NULL))
Run Code Online (Sandbox Code Playgroud)

更新是通过存储过程完成的:(ClaEvaluationId是主键)

CREATE PROCEDURE [dbo].[UpdateProc] (
    @ClaEvaluationId int,
    @DateScheduled datetime,
    @DateGiven datetime,
    @PrimaryConsultantId int,
    @AdditionalConsultants nvarchar(500),
    @ResultingClaLevel decimal(2,1)
) AS

SET NOCOUNT ON

UPDATE [dbo].[ClaEvaluation]
SET
    [DateScheduled] = @DateScheduled
    ,[DateGiven] = …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures check-constraints

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

Oracle自动生成检查约束

当我创建包含非空列的表时,Oracle自动创建检查约束为非null:像这样(从user_constraints视图查询)

NAME                           TYPE SEARCH_CONDITION
------------------------------ ---- ---------------------------------------
SYS_C0036357                   C    "SUPPLIER_ID" IS NOT NULL
SYS_C0036358                   C    "SUPPLIER_NAME" IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

那么,有没有办法知道Oracle(Auto)创建的约束或者用户创建的约束.

谢谢.

oracle check-constraints

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

是否可以将Unique约束与Check约束相关联?

我有一个表access的架构如下:

create table access (
    access_id int primary key identity,
    access_name varchar(50) not null,
    access_time datetime2 not null default (getdate()),
    access_type varchar(20) check (access_type in ('OUTER_PARTY','INNER_PARTY')),
    access_message varchar(100) not null,
)
Run Code Online (Sandbox Code Playgroud)

仅允许访问类型OUTER_PARTY and INNER_PARTY.

我想要实现的是INNER_PARTY每次登录(用户)每天只能输入一次,但OUTER_PARTY可以记录任意次数.所以我想知道是否有可能直接这样做,或者是否存在创造这种限制的习语.

我已经检查了这个问题:结合UNIQUE和CHECK约束,但无法将它应用于我的情况,因为它的目标是另一回事.

t-sql sql-server check-constraints unique-constraint sql-server-2008

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

使用转义字符的邮政编码的SQL检查声明

我试过看其他方面,但我似乎无法弄清楚我在做什么有什么问题.我试图在列上创建一个检查约束,该列应该包含格式为"00000-0000"的9位邮政编码.这是一个赋值,所以我唯一能做的就是创建一个检查约束.

我已经成功地将check语句用于其他列,但由于某种原因,我在Stack Overflow上找到的语句不起作用.唯一允许的字符是数字和连字符(' - ').

alter table Student
    add constraint student_zip_ck
    check (Zip not like '%[0-9\-]%' escape '\');
Run Code Online (Sandbox Code Playgroud)

由于此检查约束是在Stack Overflow上的另一个(正评级)问题之后建模的,所以我不知道可能出现什么问题.这是我收到的错误.

Error starting at line 751 in command:
alter table Student
  add constraint student_zip_ck
  check (Zip not like '%[0-9\-]%' escape '\')
Error report:
SQL Error: ORA-00604: error occurred at recursive SQL level 1
ORA-01424: missing or illegal character following the escape character
00604. 00000 -  "error occurred at recursive SQL level %s"
*Cause:    An error occurred while processing a recursive SQL …
Run Code Online (Sandbox Code Playgroud)

sql oracle escaping check-constraints

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

检查约束SQL中的IF

我有这张桌子..

CREATE TABLE [dbo].[Tipo_Servicios_Info](
[TSI_TS_Id] [int] NOT NULL,
[TS_Tar_Id] [int] NOT NULL,
[TS_PDI_Id] [int] NOT NULL,
[TSI_Descripcion] varchar(100),
[TSI_FechaIni] date not null,
[TSI_FechaFin] date not null,
[TSI_HoraMin] time,
[TSI_HoraMax] time,
[TSI_Duracion] varchar(50) not null,
[TSI_Unidad] varchar(50) not null,
[TSI_Cantidad] int not null,

CONSTRAINT [PK_TIPO_SERVICIOS_INFO] PRIMARY KEY CLUSTERED 
(
[TSI_TS_Id] ASC,
[TS_Tar_Id] ASC,
[TS_PDI_Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
       ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
Run Code Online (Sandbox Code Playgroud)

有一些检查..

ALTER TABLE Dbo.Tipo_Servicios_Info …
Run Code Online (Sandbox Code Playgroud)

sql-server check-constraints

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

如何创建一个简洁的SQL"检查约束",禁止所有字符串字段的某些字符?

我有一个SQL(SQL Server Express 2008)表,其中包含一些VARCHAR字段.

我想创建一个Check Constraint将确保没有VARCHAR值包含某些字符.

示例:(不允许在FirstName和LastName列中使用<,>字符)

(NOT [FirstName] LIKE '%<%' 
AND NOT [FirstName] LIKE '%>%' 
AND NOT [FirstName] LIKE '%?%')
AND 
(NOT [LastName] LIKE '%<%' 
AND NOT [LastName] LIKE '%>%' 
AND NOT [LastName] LIKE '%?%')
Run Code Online (Sandbox Code Playgroud)

上面的SQL语法工作正常,但如果有简单的方法做同样的事情会很好.请注意示例中的冗余.如果我想添加更多列和/或无效字符,这很麻烦

如果我们可以做这样的事情会很好:

NOT FirstName,LastName LIKE IN ('<','>','?')
Run Code Online (Sandbox Code Playgroud)

我可以在Check Constraint表达式中做这样的事情吗?

sql t-sql check-constraints sql-server-express

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

SQL检查约束

我正在尝试创建一个约束来检查项目是否只有一个员工,其角色是项目负责人,但同时可以让其他员工具有不同的角色.

我的表定义:

CREATE TABLE employee
( employee_id INT NOT NULL PRIMARY KEY
,employee_role VARCHAR(15) NOT NULL
, CHECK (employee_role in ('project_leader', 'administrator', 'member')) 
)


CREATE TABLE project
( project_id INT NOT NULL PRIMARY KEY
, name VARCHAR(50)
, employee_id INT NOT NULL
, employee_role VARCHAR(15) NOT NULL
, CONSTRAINT employee_project_FK
    FOREIGN KEY (employee_id, employee_role)
    REFERENCES employee (employee_id, employee_role)
, CONSTRAINT only_one_project_leader
    CHECK (employee_role = 'project_leader')
) ;
Run Code Online (Sandbox Code Playgroud)

我不清楚如何在约束中表达这一点以及我需要改变什么.如果有人告诉我我做错了什么,我会很感激.

sql derby check-constraints

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

Postgres 9.x 中 CHECK 约束的成本是多少?

我有一个有 60 列的表。其中 20 个是“NotEmpty”,6 个是“NotNull”。

我有空值和 Null 值(在我的情况下总是意味着“没有数据”)。我想将列与一种类型的约束统一起来。

我读过空值很便宜(以字节大小计)。那么也许使用 NotEmpty 约束?但也许 NotNull 约束表现更好?coalesce()或者也许在检索数据时同时拥有值和使用会更好?

Postgres 9.x 中的约束CHECK成本是多少?你的经历怎么样?有什么基准吗?INSERTUPDATE

sql postgresql benchmarking check-constraints postgresql-9.1

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

Oracle Constraint和null值

在Oracle DB上,如果我在同一列上有一个Nullable列和一个检查约束,将值限制为'ABC'或'DEF',我可以在该列中插入一个空值的行(假定为null)不是约束值之一)?

oracle check-constraints

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

如何在postgresql中禁用检查约束

我有下表,其中包含工资列的检查约束。我想暂时禁用检查约束。如何禁用和启用检查约束?

CREATE TABLE "Employee_Salary_Details"(
  empno int,
  ename varchar(100),
  sal numeric CONSTRAINT CK_SAL CHECK(sal>3500)
)

INSERT INTO "Employee_Salary_Details" VALUES(101,'RAM',200);

ALTER TABLE "Employee_Salary_Details" DISABLE  CONSTRAINT CK_SAL 
Run Code Online (Sandbox Code Playgroud)

我尝试过,但它显示错误消息。是否可以禁用和启用 heck 约束?

postgresql ddl check-constraints

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