我想将业务规则应用于表中的行(SQL Server 2008).但是,表中的历史数据不符合此规则,并且没有好的方法使其符合(没有合理默认值的未知值.)所以我希望仅在新插入时检查CHECK CONSTRAINT 行,或更新行时.
我创建了这样一个约束,并设置以下值:
插入新记录时,一切似乎都很好.但是,如果我更新记录,即使更新的记录符合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) 当我创建包含非空列的表时,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)创建的约束或者用户创建的约束.
谢谢.
我有一个表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
我试过看其他方面,但我似乎无法弄清楚我在做什么有什么问题.我试图在列上创建一个检查约束,该列应该包含格式为"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) 我有这张桌子..
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(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表达式中做这样的事情吗?
我正在尝试创建一个约束来检查项目是否只有一个员工,其角色是项目负责人,但同时可以让其他员工具有不同的角色.
我的表定义:
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)
我不清楚如何在约束中表达这一点以及我需要改变什么.如果有人告诉我我做错了什么,我会很感激.
我有一个有 60 列的表。其中 20 个是“NotEmpty”,6 个是“NotNull”。
我有空值和 Null 值(在我的情况下总是意味着“没有数据”)。我想将列与一种类型的约束统一起来。
我读过空值很便宜(以字节大小计)。那么也许使用 NotEmpty 约束?但也许 NotNull 约束表现更好?coalesce()或者也许在检索数据时同时拥有值和使用会更好?
Postgres 9.x 中的约束CHECK成本是多少?你的经历怎么样?有什么基准吗?INSERTUPDATE
sql postgresql benchmarking check-constraints postgresql-9.1
在Oracle DB上,如果我在同一列上有一个Nullable列和一个检查约束,将值限制为'ABC'或'DEF',我可以在该列中插入一个空值的行(假定为null)不是约束值之一)?
我有下表,其中包含工资列的检查约束。我想暂时禁用检查约束。如何禁用和启用检查约束?
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 约束?
sql ×4
oracle ×3
sql-server ×3
postgresql ×2
t-sql ×2
benchmarking ×1
ddl ×1
derby ×1
escaping ×1