我使用SQL Server 2008
我在同一个表中的多个列上使用CHECK CONSTRAINT来尝试验证数据输入.
我收到一个错误:
列'AAAA'的列CHECK约束引用另一列,表'XXXX'.
CHECK CONSTRAINT不能以这种方式工作.
在不使用FK的情况下在单个表上实现此目的的任何其他方法?
谢谢
这是我的代码示例
CREATE TABLE dbo.Test
(
EffectiveStartDate dateTime2(2) NOT NULL,
EffectiveEndDate dateTime2(2) NOT NULL
CONSTRAINT CK_CmsSponsoredContents_EffectiveEndDate CHECK (EffectiveEndDate > EffectiveStartDate),
);
Run Code Online (Sandbox Code Playgroud) 我有以下(虚构)表:
?????????????????????? ??????????????????????
? Course ? ? Person ?
?????????????????????? ??????????????????????
? ID ? int ? ? ID ? int ?
? Name ? varchar(50) ? ? Name ? varchar(50) ?
?????????????????????? ??????????????????????
?????????????????????? ???????????????????????
? Occupation ? ? B_Occupation_Person ?
?????????????????????? ???????????????????????
? ID ? int ? ? Person_ID ? int ?
? Name ? varchar(50) ? ? Ocupation_ID ? int ?
?????????????????????? ???????????????????????
???????????????????
? B_Course_Person ?
???????????????????
? Course_ID ? int ?
? Person_ID ? int ? …
Run Code Online (Sandbox Code Playgroud) (对不起,如果这是一个重复的帖子,但我似乎找不到这个问题的例子)
我有一个有 4 列的 mysql 表,如下所示:
SomeTable
=========
ID (int)
name (varchar(255))
column1 (varchar(255))
column2 (double)
Run Code Online (Sandbox Code Playgroud)
我现在想要做的是添加一个约束,以便始终有一列(column1 或 column2)具有空值。我尝试了以下方法:
ALTER TABLE mytable
ADD CHECK (
(column1 IS NOT NULL && column2 IS NULL) ||
(column2 IS NOT NULL && column1 IS NULL)
)
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用,因为我仍然可以遇到这样的情况:
CASE1:
------
name: bla
column1: null
column2: null
CASE2:
------
name: bla
column1: somevalue
column2: 123
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它工作,以便在我尝试 case1 和 case2 时出现错误?
(另外:如果我没记错的话:我使用的约束可以缩短,但我不记得它是如何完成的。所以如果有人帮助我,我会很高兴!)
需要在列上构建约束,以确保所有行中只有一个值为1,而其他所有值都为0.
存在触发器的解决方案,但我希望内置一些东西.
这样的事情有可能吗?
我必须使用检查约束在SQL Server中创建一个表,以仅允许大写的值集
我的代码如下:
CREATE TABLE Client(
clientID INT IDENTITY(1,1) PRIMARY KEY,
FirstName VARCHAR(30) NOT NULL,
LastName VARCHAR(30) NOT NULL,
StreetAddress VARCHAR(50),
Suburb VARCHAR(25),
State VARCHAR(4) CHECK (state in ('QLD', 'NSW', 'VIC', 'TAS', 'SA', 'WA', 'NT', 'ACT')),
PhoneNumber VARCHAR(10)
);
Run Code Online (Sandbox Code Playgroud)
请检查错误并帮助我
我有一个通过中间CustomerAddress表链接到地址表的customers表.这意味着客户可以拥有多个地址,而地址可以拥有许多客户.(这是必要的,因为我们将配偶和子女作为单独的客户处理,每个人都可以有交付,工作,账单和其他地址).
我希望客户能够指定首选地址.
我的想法是在customers表中创建一个链接到CustomerAddress记录的新列.
我的问题是 - 如何确保所选择的首选地址是该客户地址之一?
我的想法是在customers.preferredAddress字段上放置一个Check约束,该字段检查给定的CustomerAddress以查看该记录的客户ID是否与正在更新的客户匹配.
这可能吗?我只使用Check约束来检查像(Value> 0)等简单的东西.
谢谢你的帮助
CREATE TABLE LOCATION (
LOCID VARCHAR2(5)
, MINQTY NUMBER
, MAXQTY NUMBER
, PRIMARY KEY (LOCID)
, CONSTRAINT CHECK_LOCID_LENGTH CHECK (LENGTH(LOCID) = 5)
, CONSTRAINT CHECK_MINQTY_RANGE CHECK (MINQTY BETWEEN 0 AND 999)
, CONSTRAINT CHECK_MAXQTY_RANGE CHECK (MAXQTY BETWEEN 0 AND 999)
, CONSTRAINT CHECK_MAXQTY_GREATER_MIXQTY CHECK (MAXQTY >= MINQTY)
);
CREATE OR REPLACE PROCEDURE ADD_LOCATION_TO_DB(ploccode VARCHAR2, pminqty NUMBER, pmaxqty NUMBER) AS
BEGIN
INSERT INTO location(locid, minqty, maxqty) VALUES (ploccode, pminqty, pmaxqty);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
RAISE_APPLICATION_ERROR(-20081, 'Duplicate Location ID');
WHEN OTHERS …
Run Code Online (Sandbox Code Playgroud) 我将数据库从SQL Server迁移到PostgreSQL,并在其中一个表中遇到了一些检查约束问题。PostgreSQL版本是9.5.1。
我有一个表,该表在其中一列上具有检查约束以强制执行格式。这在SQL Server中有效。这样的想法是,只能在其中一列中输入以字母AF开头且后跟三个数字字符(例如AF001)的值。
SQL看起来像这样来创建表:
CREATE TABLE TableName (
referenceID VARCHAR(5) NOT NULL CHECK (referenceID LIKE 'AF[0-9][0-9][0-9]'),
comment VARCHAR(50) NOT NULL,
PRIMARY KEY (referenceID)
);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试输入任何数据时,它将失败。数据输入示例:
INSERT INTO TableName (reference, comment) VALUES ('AF000','A comment');
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
ERROR: new row for relation "tablename" violates check constraint "tablename_referenceID_check"
DETAIL: Failing row contains (AF000, A comment).
********** Error **********
ERROR: new row for relation "TableName" violates check constraint "tablename_referenceID_check"
SQL state: 23514
Detail: Failing row contains (AF000, A comment).
Run Code Online (Sandbox Code Playgroud)
我假设问题出在实际的检查约束上,但是我不确定。
我正在尝试为SQL中的字段编写检查约束,该字段允许一系列字符串(在本例中为省名)或空值.目前的代码是这样的:
ALTER TABLE CODEDLOCATION
ADD CHECK (ADM1='Central' OR ADM1='East' OR ADM1='Far-Western' OR ADM1='Mid-Western' OR ADM1='West')
Run Code Online (Sandbox Code Playgroud)
这适用于ADM1字段,但如果新记录中的ADM1字段存在空值/空值,则会导致错误.我尝试了以下两个选项,但都不起作用:
ALTER TABLE CODEDLOCATION
ADD CHECK (ADM1='' OR ADM1='Central' OR ADM1='East' OR ADM1='Far-Western' OR ADM1='Mid-Western' OR ADM1='West')
ALTER TABLE CODEDLOCATION
ADD CHECK (ADM1=null OR ADM1='Central' OR ADM1='East' OR ADM1='Far-Western' OR ADM1='Mid-Western' OR ADM1='West')
Run Code Online (Sandbox Code Playgroud)
将HSQLDB与OpenOffice Base一起使用.谢谢!
PS我在这里使用检查而不是外键约束的原因与使用OO Base表单的一些挑战有关...
我在oracle DB中创建一个表并尝试添加约束,以便列中允许的数字为1,2,3.
CREATE TABLE "TABLE_EXAMPLE"
(
.
.
"PROTOCOL" NUMBER (1,2,3),
....)
CONSTRAINT "CH1"
CHECK ("PROTOCOL" BETWEEN 1 AND 3),
Run Code Online (Sandbox Code Playgroud)
我做对了还是做得更好?
为了获得类似于mysql ENUM类型的列,我编写了一个sql查询,如下所示
ALTER TABLE [DbName].[dbo].[MediaContent]
ADD MediaType nvarchar(50)
check(MediaType in ('audio','video','song','other'))
Run Code Online (Sandbox Code Playgroud)
这如愿(用于测试):但现在我想删除此列但没有成功。似乎没有办法直接删除有约束的列。我该如何解决这个问题?我想删除此列并创建另一列。
这是我在删除时收到的错误消息
The object 'CK__MediaCont__Media__14270015' is dependent on column 'MediaType'.
ALTER TABLE DROP COLUMN MediaType failed
because one or more objects access this
column. (Microsoft SQL Server, Error: 5074)
Run Code Online (Sandbox Code Playgroud) check-constraint ×11
sql ×9
sql-server ×4
constraints ×3
ddl ×2
oracle ×2
format ×1
hsqldb ×1
mysql ×1
plsql ×1
postgresql ×1
ssms ×1
t-sql ×1