无法理解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_dept
、dept_name
、admission
和localization
。在约束选项卡上,我还可以看到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)建表代码的主要内容,如果未能解决你的问题,请参考以下文章