Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 对列添加检查和对同一列添加检查约束之间的区别_Sql_Oracle_Constraints_Ddl - Fatal编程技术网

Sql 对列添加检查和对同一列添加检查约束之间的区别

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 ); 删除已

在使用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
);
删除已创建的系统约束

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,但我没有看到。