数据库—DDL(模式,表和索引)

本文深入解析SQL中的数据定义语言(DDL),包括模式、表、索引的创建与修改,以及如何进行模式和表的删除。涵盖了创建模式、表定义、列约束、表约束、索引创建、修改和删除的基本语法和实例。

数据库—SQL之DDL语言

先来看SQL的一些符号约定

  • 表示X是需要进一步定义或说明语言成分
  • [X]表示X可以缺省或出现一次
  • {X}表示X可以出现一次
  • X |Y表示或者X出现,或者Y出现,但二者不能同时出现

模式的定义

key1   : CREATE SCHEMA <模式名> [<模式元素>]
  • 创建一个以<模式名>命名的模式,并可以在创建模式的同时为该模式创建或不创建模式元素
  • <模式元素>可以是表定义、视图定义、断言定义、授权定义等
  • 这种格式没有授权其他用户访问创建的模式,以后可以用授权语句授权
 key2   :CREATE SCHEMA [<模式名>] AUTHORIZATION <用户名> [<模式元素>]
  • 与第一种的区别在于它将创建的模式授权予<用户名>指定的用户
  • 当<模式名>缺省时,用<用户名>作为模式名

eg1:创建关系模式

CREATE SCHEMA Supply_schema AUTHORIZATION WangQiang;
//创建一个名为Supply_schema的模式,并为WangQiang所拥有
 
 CREATE SCHEMA Supply_schema;  
//创建一个名为Supply_schema的模式,但未向任何用户授权
 
CREATE SCHEMA AUTHORIZATION WangQiang;  
//为WangQiang创建一个模式,并用WangQiang命名
 

eg2:创建关系模式的同时创建该模式中的对象

CREATE SCHEMA Supply_schema CREATE TABLE Suppliers
   (Sno   CHAR(5) PRIMERY KEY,
    Sname   CHAR(20) NOT NULL,
    Status   SMALLINT,
    Address  CHAR(30),
    Phone     CHAR(10));
    //创建模式Supply_schema的同时在该模式中定义一个表Suppliers
    //Suppliers的属性列分别为Sno,Sname,Status,Address和Phone

模式的删除

 DROP SCHEMA <模式名> CASCADERESTRICT 

其中CASCADE和RESTRICT两者必须选择其一

  • CASCADE,则删除<模式名>指定模式得同时并删除该模式中的所有数据库对象(基本表、视图、断言等)
  • RESTRICT,则仅当<模式名>指定的模式不包含任何数据库对象时才删除指定的模式,否则拒绝删除

eg :模式的删除

 DROP SCHEMA Supply_schema RESTRICT
 //仅当模式Supply_schema中不包含任何数据库对象时
 //才删除模式Supply_schema,否则什么也不做
 DROP SCHEMA Supply_schema CASCADE
 //将直接删除模式Supply_schema,并同时删除该模式中所有的数据库对象 

表的定义

 CREATE TABLE <表名> 
(<列名><数据类型> [DEFAULT <缺省值>] [列级约束定义],
<列名><数据类型> [DEFAULT <缺省值>] [列级约束定义],, 
[<表级约束定义>,, <表级约束定义>])
  • 可选短语“DEFAULT <缺省值>”定义列上的缺省值,<缺省值>是<类型>中的一个特定值或空值(NULL)
  • 列级约束定义和该列相关的完整性约束
    • NOT NULL :不允许该列取空值
    • PRIMARY KEY :指明该列是主码
    • UNIQUE :该列上的值必须唯一
    • CHECK<条件>:指明该列的值必须满足的条件,其中条件是一个涉及该列的布尔表达式
  • 表级约束定义和一个列或者多个列同时相关的完整性约束
    • PRIMARY KEY (A1, …, Ak):说明属性列A1, …, Ak构成该关系的主码
    • UNIQUE (A1, …,Ak):说明属性列A1, …, Ak上的值必须惟一,这相当于说明A1, …, Ak构成该关系的候选码
    • CHECK (<条件>):说明该表上的一个完整性约束条件
    • FOREIGN KEY (A1, …, Ak) REFERENCES <外表名>(<外表主码>) [<参照触发动作>]:定义外码

eg1:

CREATE TABLE Teachers//创建表Teachers
(Tno CHAR (7) PRIMARY KEY,//定义Tno为主码
Tname CHAR (10) NOT NULL,//Tname不能取空值     
Sex  CHAR (2) CHECK (Sex= ‘男’ OR Sex= ‘女’),//性别必须为男或者女     
Birthday DATE,        
Title CHAR (6),
Dno CHAR (4),
FOREIGN KEY (Dno) REFERENCES Departments (Dno));
//约束关系:表Teachers的Dno必须在表Departments中的Dno里找到

eg2:

CREATE TABLE SC//创建表SC
(Sno  CHAR (9),
Cno  CHAR (5),
Grade  SMALLINT CHECK (Grade>=0 AND  Grade<=100),//成绩必须在0到100之间
PRIMARY KEY (Sno,Cno),//定义Sno和Cno的联合为主码
FOREIGN KEY (Sno) REFERENCES Students (Sno),
//约束关系:表SC中的Sno必须在表Students中的Sno里找到
FOREIGN KEY (Cno) REFERENCES Courses (Cno));
//约束关系:表SC中的Cno必须在表Courses中的Cno里找到

修改基本表

新增列:
ALTER TABLE <表名> [ADD [COLUMN] <列名><数据类型>[列级约束定义]]
为已有列设置缺省值:
ALTER TABLE <表名> [ALTER [COLUMN] <列名> {SET DEFAULT <缺省值> | DROP DEFAULT}]
删除列:
ALTER TABLE <表名> [DROP [ COLUMN ] <列名> {CASCADE | RESTRICT}]
添加表约束定义:
[ADD <表约束定义>]
删除表约束定义:
ALTER TABLE <表名> [DROP CONSTRAINT <约束名>{CASCADE | RESTRICT}]

eg:

 ALTER TABLE Courses ADD Pno CHAR (5); 
 //在Courses中增加一个新列Pno,表示课程的先行课的课程号

 ALTER TABLE Students ALTER Sex SET DEFAULT ‘女’;
 //在Students的Sex列设置缺省值“女”可以减少大约一半学生性别的输入

 ALTER TABLE Students ALTER Sex DROP DEFAULT;
 //删除Sex上的缺省值可以用

 ALTER TABLE Courses DROP Pno;
 /// 删除Courses中的Pno列可以用

删除基本表

 DROP TABLE <表名> {CASCADERESTRICT}
  • CASCADE表示及联删除,依赖于表的数据对象(最常见的是视图)也将一同被删除
  • RESTRICT表示受限删除,如果基于该表定义有视图,或者有其他表引用该表(如CHECK、FOREIGN KEY等约束),或者该表有触发器、存储过程或函数等,则不能删除
 DROP TABLE SC RESTRICT;
 //仅当没有依赖于SC的任何数据库对象删除才能成功
 DROP TABLE SC CASCADE;
 //删除SC表,以及依赖于此表的数据对象

索引的创建

索引—旦建立,就由系统来选择和维护,无需用户干预,但当删除一些不必要的索引时,可用下列语句来实现

CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名> (<列名> [<次序>]{,<列名> [<次序>]})
  • <索引名>为建立的索引命名
  • <表名>是要建立索引的基本表的名字
  • 索引可以建在该表的一列或多列上,各列名间用逗号分隔;每个<列名>后可以用<次序>指定索引值的排列次序,次序可以是ASC(升序)和DESC(降序),缺省值为ASC
  • UNIQUE表示该索引为惟一性索引UNIQUE缺省时,创建的索引为非唯一性索引
  • CLUSTER表示建立的索引是聚簇索引,缺省时为非聚簇索引
  • 创建索引不仅创建索引结构,而且将索引的定义存储在数据字典中

删除索引

 DROP INDEX <索引名>
  • 删除索引时,系统将删除索引结构,并同时从数据字典中删去有关该索引的定义

eg:删除索引

DROP INDEX Student_Dept;//删除索引Student_Dept
<think>嗯,用户现在的问题是关于在达梦数据库中复制结构时如何包含索引主键。之前我已经提供过四种方法,但用户现在特别提到要包含索引主键,这说明用户可能在之前的尝试中发现这些对象没有被复制,或者需要更完整的结构复制。 首先,我需要回顾之前给出的方法。比如使用CREATE TABLE ... LIKE 语句,但当时提到需要手动创建索引约束,这可能就是用户遇到问题的地方。用户现在希望有一个更自动化的方法,或者更详细的步骤来确保索引主键也被复制。 接下来,我需要查看用户提供的引用内容。引用[1]提到模式是对象的逻辑容器,包含索引等,这可能意味着在跨模式复制时需要注意模式的问题。引用[2]看起来可能有误,可能涉及系统视图查询,比如查询函数或参数,但具体内容不清晰,可能用户误粘贴了部分内容。不过这可能提示我需要考虑使用系统或视图来获取索引主键的定义。 用户的需求很明确,他们需要复制结构时包含所有相关的索引主键。达梦的CREATE TABLE ... LIKE 可能只复制结构,但不包括索引约束,所以需要手动处理。这时候可能需要结合多种方法,比如生成原DDL,然后修改名后执行,这样可以包含所有对象。 另外,用户可能没有权限直接访问系统,或者对如何生成完整的DDL不太熟悉。所以需要给出详细步骤,比如使用DBMS_METADATA.GET_DDL函数来获取定义的DDL,然后执行。同时,可能需要处理自增列的问题,或者约束名称冲突的问题,这些都需要在回答中提到注意事项。 还要考虑用户提到的工具方法,比如使用DM管理工具生成SQL脚本,然后修改执行。这种方法可能更直观,适合不熟悉SQL的用户。同时,IMP/EXP工具的使用也需要确认是否在导出时包含索引,可能需要检查参数是否正确。 用户可能遇到的问题包括:如何确保主键索引被正确复制,如何处理跨模式的情况,以及在导入时出现已存在的错误如何处理。这些问题需要在回答中给出解决方案,比如修改DDL中的模式名称,或者使用IF NOT EXISTS语句。 总结下来,回答需要分步骤说明不同的方法,每种方法如何包含索引主键,注意事项,以及可能遇到的问题解决办法。同时,结合之前的回答,补充更多细节,确保用户能够顺利完成操作。</think>在达梦数据库中实现包含索引、主键的完整结构复制,可通过以下三种方法实现: ### 一、CREATE TABLE + 手动补全(推荐V8+版本) ```sql -- 1. 基础结构复制(含字段、约束) CREATE TABLE NEW_TABLE LIKE ORIGINAL_TABLE; -- 2. 查询原索引定义 SELECT INDEX_NAME, INDEX_DEF FROM DBA_INDEXES WHERE TABLE_NAME='ORIGINAL_TABLE'; -- 3. 重建索引(示例) CREATE UNIQUE INDEX IDX_NEW_PK ON NEW_TABLE(COLUMN1); ALTER TABLE NEW_TABLE ADD CONSTRAINT PK_NEW PRIMARY KEY(COLUMN1); ``` *特点*:兼容性强,但需手动操作[^1] ### 二、元数据提取法(DBA常用) ```sql -- 1. 获取完整DDL(包含索引/约束) SELECT DBMS_METADATA.GET_DDL('TABLE','ORIGINAL_TABLE','SYSDBA') FROM DUAL; -- 2. 输出结果示例 /* CREATE TABLE "SYSDBA"."ORIGINAL_TABLE" ( "ID" INT PRIMARY KEY, "NAME" VARCHAR(50), CONSTRAINT "CK_AGE" CHECK(AGE>0) ) STORAGE(ON "MAIN", CLUSTERBTR) ; CREATE UNIQUE INDEX "IDX_ORG_PK" ON "SYSDBA"."ORIGINAL_TABLE"("ID"); */ -- 3. 修改名/模式名后执行 ``` *注意*:需替换OBJECT_NAMESCHEMA_NAME参数[^1] ### 三、工具链组合方案 1. **使用dtsql工具导出**: ```shell ./dtsql SYSDBA/SYSDBA@localhost:5236 -e "TABLE ORIGINAL_TABLE" -o /tmp/ddl.sql ``` 2. **脚本处理**: ```shell sed 's/ORIGINAL_TABLE/NEW_TABLE/g' /tmp/ddl.sql | grep -E 'CREATE|ALTER' ``` 3. **执行生成脚本**: ```sql START '/tmp/modified_ddl.sql'; ``` ### 跨模式复制注意事项 1. 显式指定模式名: ```sql CREATE TABLE "NEW_SCHEMA"."NEW_TABLE" LIKE "OLD_SCHEMA"."ORIGINAL_TABLE"; ``` 2. 检查权限: ```sql GRANT CREATE TABLE TO NEW_USER; GRANT SELECT ANY DICTIONARY TO NEW_USER; ``` 3. 处理自增列: ```sql -- 查询原自增列信息 SELECT COLUMN_NAME, IDENTITY FROM USER_TAB_IDENTITY_COLS WHERE TABLE_NAME='ORIGINAL_TABLE'; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值