无法理解SQL(Oracle)建表代码

Posted

技术标签:

【中文标题】无法理解SQL(Oracle)建表代码【英文标题】:Trouble understanding SQL (Oracle) create table code 【发布时间】:2010-10-18 18:17:16 【问题描述】:

我知道 Oracle 的创建表语法

CREATE TABLE MyTable(
   id int primary key,
   ...
);

这将创建一个名为 MyTable 的表,其主键为 int。所以,这里没有什么新鲜事。

但我无法理解以下查询:

CREATE TABLE departament (
   cod_dept    INTEGER CONSTRAINT dept_key PRIMARY KEY,
   dept_name CHAR(15) NOT NULL,
   admission    DATE      NOT NULL,
   localization CHAR(20))

当我在departement 的表上查看Oracle 的SQL Developer 软件时,我可以看到4 列:cod_deptdept_nameadmissionlocalization。在约束选项卡上,我还可以看到dept_key,但我对这可能意味着什么感到困惑。 dept_key 这里的目的是什么?

编辑

好的,似乎这是一种定义要添加到表中的约束名称的方法。我的下一个问题是,你为什么不直接称它为与主键列相同的名称?从我所见,Oracle 默认情况下似乎只是为约束创建一个随机名称!

谢谢

【问题讨论】:

【参考方案1】:

当你写id int primary key时,Oracle会创建一个主键约束来保证主键值的唯一性。所有约束都有名称,因此在这种情况下,Oracle 会为该约束分配一个自动生成的名称。但是您可以使用CONSTRAINT 语法显式设置此约束的名称:

cod_dept    INTEGER CONSTRAINT dept_key PRIMARY KEY

这个名字以后可以用来指代约束,例如删除或修改它:

ALTER TABLE department DROP CONSTRAINT dept_key;

编辑: 约束名称在架构中是唯一的,因此 Oracle 不能只使用主键列的名称作为约束名称。

【讨论】:

谢谢。编辑了 OP,因为我还有 1 个问题。 约束名称在 SCHEMA(或用户)中是唯一的,而不是在数据库中。【参考方案2】:

主键可以显式命名。 dept_key 只是一个名称。

【讨论】:

【参考方案3】:

dept_key 是主键约束的名称。这意味着cod_dept 是表的唯一标识符,是标识行的机制,因此任何给定值只能出现一次。

【讨论】:

【参考方案4】:

这是您创建的表示主键的约束。

表格由以下部分组成:

列(数据所在的位置) 索引(用于更快搜索的数据的索引副本) 约束(关于表中可以包含哪些数据的规则,包括 PK、FK 和检查约束)。

【讨论】:

【参考方案5】:

dept_key 是约束的名称。您在此处指定了名称:"INTEGER CONSTRAINT dept_key PRIMARY KEY,",因此它将创建名称为 dept_key 的约束。

【讨论】:

【参考方案6】:

同样的另一种语法是在您的CREATE TABLE 指令之后编写以下内容。

ALTER TABLE department
ADD CONSTRAINT dept_key PRIMARY KEY (cod_dept)

dept_key 是您创建的作为该表主键的约束的名称。为了让数据库引擎知道主键,并为它建立索引以获得最快的结果等等,它需要创建一个已知的索引约束。在这里,是你给了dept_key这个名字。

为了您的好消息,经常看到写PK_[table name]用于主键约束和FK_[current_table_name]_[foreign_table_name]用于外键约束。

希望这会有所帮助! =)

【讨论】:

【参考方案7】:

我认为,每当我们创建主键值时,默认情况下 Oracle 会为其创建具有相同名称的约束,但看起来您正在创建具有其他名称的约束。 谢谢你

【讨论】:

以上是关于无法理解SQL(Oracle)建表代码的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库建表语句连续执行的问题

授予权限以在 oracle sql 过程中创建表

oracle建表语句

oracle中创建表的sql语句如何添加default约束

oracle建表语句

怎样用oracle查建表语句