Sql 对列添加检查和对同一列添加检查约束之间的区别
在使用XML比较表结构时,我们得到了检查约束的相同业务逻辑的表结构的差异。 请检查并向我们解释差异Sql 对列添加检查和对同一列添加检查约束之间的区别,sql,oracle,constraints,ddl,Sql,Oracle,Constraints,Ddl,在使用XML比较表结构时,我们得到了检查约束的相同业务逻辑的表结构的差异。 请检查并向我们解释差异 CREATE TABLE ESWAR(ID INT NOT NULL, NAME VARCHAR2(10)); ALTER TABLE ESWAR ADD CHECK("NAME" IS NOT NULL); 添加检查后的表定义: create table ESWAR ( id INTEGER not null, name VARCHAR2(10) not null ); 删除已
CREATE TABLE ESWAR(ID INT NOT NULL, NAME VARCHAR2(10));
ALTER TABLE ESWAR ADD CHECK("NAME" IS NOT NULL);
添加检查后的表定义:
create table ESWAR
(
id INTEGER not null,
name VARCHAR2(10) not null
);
删除已创建的系统约束
SELECT T.CONSTRAINT_NAME FROM ALL_Constraints t WHERE t.TABLE_NAME='ESWAR' AND T.SEARCH_CONDITION_VC='"NAME" IS NOT NULL';--SYS_C00179403
ALTER TABLE ESWAR DROP CONSTRAINT SYS_C00179403;
再次创建检查约束,如下所示
ALTER TABLE ESWAR
ADD CONSTRAINT CONST_ESWAR_CHECK
CHECK ("NAME" IS NOT NULL);
创建约束后的表定义:
create table ESWAR
(
id INTEGER not null,
name VARCHAR2(10)
);
-- Create/Recreate check constraints
alter table ESWAR
add constraint CONST_ESWAR_CHECK
check ("NAME" IS NOT NULL);
SELECT * FROM ALL_Constraints t WHERE t.TABLE_NAME='ESWAR' AND T.SEARCH_CONDITION_VC='"NAME" IS NOT NULL';---CONST_ESWAR_CHECK
考虑到:
ALTER TABLE ESWAR ADD CHECK(“名称”不为空);
及
ALTER TABLE ESWAR ADD CONSTRAINT CONST_ESWAR_CHECK CHECK(“NAME”不为空);
约束在功能上是相同的;但是,其中一个将使用系统生成的名称生成(即SYS\u C00179403
),另一个将使用用户定义的名称生成(即CONST\u ESWAR\u CHECK
)
如果在create TABLE
语句中创建,则可以使用完全相同的选项:
创建表ESWAR(
ID INT非空主键,
名称VARCHAR2(10)不为空
);
或
创建表ESWAR(
ID INT非空主键,
名称VARCHAR2(10)检查(名称不为空)
);
或
创建表ESWAR(
ID INT
约束ESWAR\u_ID\u_NN不为空
最初立即
不可推迟
使可能
验证
约束ESWAR\u_ID\u_PK主键
最初立即
不可推迟
使可能
验证
名称VARCHAR2(10)
约束ESWAR\uu NAME\uu NN不为NULL
最初立即
不可推迟
使可能
验证
);
考虑到:
ALTER TABLE ESWAR ADD CHECK(“名称”不为空);
及
ALTER TABLE ESWAR ADD CONSTRAINT CONST_ESWAR_CHECK CHECK(“NAME”不为空);
约束在功能上是相同的;但是,其中一个将使用系统生成的名称生成(即SYS\u C00179403
),另一个将使用用户定义的名称生成(即CONST\u ESWAR\u CHECK
)
如果在create TABLE
语句中创建,则可以使用完全相同的选项:
创建表ESWAR(
ID INT非空主键,
名称VARCHAR2(10)不为空
);
或
创建表ESWAR(
ID INT非空主键,
名称VARCHAR2(10)检查(名称不为空)
);
或
创建表ESWAR(
ID INT
约束ESWAR\u_ID\u_NN不为空
最初立即
不可推迟
使可能
验证
约束ESWAR\u_ID\u_PK主键
最初立即
不可推迟
使可能
验证
名称VARCHAR2(10)
约束ESWAR\uuuu名称\uuuu NN不为空
最初立即
不可推迟
使可能
验证
);
当您说“在列上添加检查”时,实际上是在添加检查约束。没有“检查”这样的东西。对于非空检查约束的特定情况,基本的
notnull
比显式检查约束好,因为优化器知道notnull
列,但不查看其他用户定义的检查约束定义。我同意你的看法William Robertson,但我主要关心的是为什么表定义变得不同。到底什么不同?在我的测试中,我可以创建任意数量的匿名(系统命名)检查约束,如(名称不为NULL)
或(“名称”不为NULL)
,它们都不能使列在标准、有用的意义上实际上不为NULL。否则,唯一的区别是名称,如果您自己命名,则名称为CONST_ESWAR\u CHECK
,否则名称为系统生成。您提到了XML,但我没有看到任何XML。当您说“在列上添加检查”时,实际上是在添加检查约束。没有“检查”这样的东西。对于非空检查约束的特定情况,基本的notnull
比显式检查约束好,因为优化器知道notnull
列,但不查看其他用户定义的检查约束定义。我同意你的看法William Robertson,但我主要关心的是为什么表定义变得不同。到底什么不同?在我的测试中,我可以创建任意数量的匿名(系统命名)检查约束,如(名称不为NULL)
或(“名称”不为NULL)
,它们都不能使列在标准、有用的意义上实际上不为NULL。否则,唯一的区别是名称,如果您自己命名,则名称为CONST_ESWAR\u CHECK
,否则名称为系统生成。你提到XML,但我没有看到。