【问题标题】:Trouble understanding SQL (Oracle) create table code无法理解SQL(Oracle)建表代码
【发布时间】: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 默认情况下似乎只是为约束创建一个随机名称!

谢谢

【问题讨论】:

    标签: sql 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 会为其创建具有相同名称的约束,但看起来您正在创建具有其他名称的约束。 谢谢你

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-06-11
                • 1970-01-01
                • 1970-01-01
                • 2012-08-05
                • 2011-12-18
                • 2021-08-23
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多