Oracle 数据库表和约束条件的增删改查

1、创建数据表

1.1 语法

CREATE TABLE <表明>(
    字段1 数据类型 [列级别约束条件] [默认值],
    字段2 数据类型 [列级别约束条件] [默认值],
    ......
    [表级别约束条件]
);

常用的数据:整数,浮点数,精确小数,二进制,日期/时间,字符串等数据类型

示例一

创建TB_EMP1表

CREATE TABLE TB_EMP1 (
    ID NUMBER(11),
    NAME VARCHAR2(25),
    DEPTID NUMBER(11),
    SALARY NUMBER(8,2)
  );

1.2 查询表结构

DESC TB_EMP1;

2、主键约束语法 PRIMARY KEY CONSTRAINT

2.1 概念

主键约束: 数据唯一,并且不不允许空,分为单字段主键和多字段联合主键 类似我们的身份证

2.2 单字段主键语法如下

2.2.1 字段名 数据类型 PRIMARY KEY [默认值]

2.2.2 定义完所有列后采用以下语句

[CONSTRAINT <约束名>]  PRIMARY KEY(字段名)

示例2

创建TB_EMP2表和TB_EMP3表,定义主键为ID

--2.2.1
CREATE TABLE TB_EMP2 (
    ID NUMBER(11) PRIMARY KEY,
    NAME VARCHAR2(25),
    DEPTID NUMBER(11),
    SALARY NUMBER(8,2)
  );

--2.2.2
CREATE TABLE TB_EMP3 (
    ID NUMBER(11),
    NAME VARCHAR2(25),
    DEPTID NUMBER(11),
    SALARY NUMBER(8,2),
    CONSTRAINT PK_ID PRIMARY KEY(ID)
  );

2.3 多字段联合主键

[CONSTRAINT <约束名>] PRIMARY KEY(字段名1,字段2.....字段N)*/

示例3

CREATE TABLE TB_EMP4 (
    ID NUMBER(11),
    NAME VARCHAR2(25),
    DEPTID NUMBER(11),
    SALARY NUMBER(8,2),
    CONSTRAINT PK_ID_NAME PRIMARY KEY(ID,NAME)
);

2.4 使用ALTER TABLE 语句为数据库修改主键约束和删除约束

语法如下

ALTER TABLE <表名> ADD [CONSTRAINTS <约束名称>] PRIMARY KEY(字段名称)
ALTER TABLE <表名> DROP CONSTRAINTS <约束名称> 

示例4(主键和联合主键)

ALTER TABLE TB_EMP1 ADD CONSTRAINTS PK_ID1 PRIMARY KEY(ID,NAME);
ALTER TABLE TB_EMP1 DROP CONSTRAINTS SYS_C008827;
ALTER TABLE TB_EMP1 ADD PRIMARY KEY(ID,NAME);

2.5 查询表的约束

根据视图USER_CONSTRAINTS可以查询外键的类型

P 主键

R 外键

U 唯一

3、外键约束 FOREIGN KEY CONSTRAINT

3.1 概念

可以是空值,若不为空值时,必须等于另一个数据库中主键的某一个值,并且数据类型一致

主表:相关联字段中主键所在的表为主表

从表:相关联字段中外键所在的表为从表

3.2 语法如下

[CONSTRAINT <外键名>] FOREIGN KEY (字段) REFERENCES <主表名>(主键列)

示例5

CREATE TABLE TB_DEPT (
  ID NUMBER(11) PRIMARY KEY,
  NAME VARCHAR2(22),
  LOCATION VARCHAR2(50)
);
CREATE TABLE TB_EMP5 (
    ID NUMBER(11),
    NAME VARCHAR2(25),
    DEPTID NUMBER(11),
    SALARY NUMBER(8,2),
    CONSTRAINT ID2 PRIMARY KEY(ID),
    CONSTRAINT FK_ID FOREIGN KEY(DEPTID) REFERENCES TB_DEPT(ID)
  );
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'TB_EMP5';
--删除数据表
DROP TABLE TB_EMP5;
--重新创建表 经过测试语法[CONSTRAINT <外键名>] 是可以忽略不写
CREATE TABLE TB_EMP5 (
    ID NUMBER(11),
    NAME VARCHAR2(25),
    DEPTID NUMBER(11),
    SALARY NUMBER(8,2),
    PRIMARY KEY(ID),
    FOREIGN KEY(DEPTID) REFERENCES TB_DEPT(ID)
  );

3.3 修改数据表时进行外键的添加

语法如下

ALTER TABLE <表名> ADD [CONSTRAINTS <约束名称>] FOREIGN KEY(外键约束的字段名称) REFERENCE <主表名>(字段名称)[ON DELETE CASCADE]

示例6

CREATE TABLE TB_EMP6 (
    ID NUMBER(11),
    NAME VARCHAR2(25),
    DEPTID NUMBER(11),
    SALARY NUMBER(8,2),
    PRIMARY KEY(ID)
  );
ALTER TABLE TB_EMP6 ADD CONSTRAINTS FK_ID2 FOREIGN KEY (DEPTID) REFERENCES TB_DEPT(ID);

3.4 移除外键约束

语法如下

ALTER TABLE <表名> DROP CONSTRAINTS <约束名称>

示例7

ALTER TABLE TB_EMP6 DROP CONSTRAINTS FK_ID2;

3.5 修改约束键名称

语法如下

ALTER TABLE <表名> RENAME CONSTRAINTS <旧约束名> TO <新约束名>

示例8

ALTER TABLE TB_EMP5 RENAME CONSTRAINTS TEST1 TO TEST2;

4、唯一约束 UNIQUE CONSTRAINT

4.1 概念

要求该列唯一,允许为空,可以确保一列或者多列

4.2 语法如下

4.2.1 在定义好的列之后直接指定唯一约束

字段名 数据类型 UNIQUE

4.2.2 在指定的所有列之后指定唯一约束

[CONSTRAINT <约束名>] UNIQUE (字段1,字段2...字段N)

多字段联合唯一 保证是两个字段值不能相同 可以AB AA BA BB,但是不能两个字段都相同

示例9

--4.2.1
CREATE TABLE TB_DEPT1 (
  ID NUMBER(11) PRIMARY KEY,
  NAME VARCHAR2(22) UNIQUE,
  LOCATION VARCHAR2(50)
);
--测试插入两台NAME字段相同的值
INSERT INTO TB_DEPT1 VALUES(1,'1','1');
INSERT INTO TB_DEPT1 VALUES(2,'1','1');--ORA-00001:违反唯一约束条件(TEST.SYS_C008835) SYS_C008835 约束名称
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'TB_DEPT1'; --SYS_C008835
INSERT INTO TB_DEPT1 VALUES(2,NULL,'1');
INSERT INTO TB_DEPT1 VALUES(3,NULL,'1');
INSERT INTO TB_DEPT1 VALUES(4,NULL,'1');
select * from TB_DEPT1;
desc TB_DEPT1;
-- 4.2.2
CREATE TABLE TB_DEPT2 (
  ID NUMBER(11) PRIMARY KEY,
  NAME VARCHAR2(22),
  LOCATION VARCHAR2(50),
  UNIQUE (NAME,LOCATION)
);
CREATE TABLE TB_DEPT3 (
  ID NUMBER(11) PRIMARY KEY,
  NAME VARCHAR2(22),
  LOCATION VARCHAR2(50),
  CONSTRAINT UNIQUE_NAEM_LOCA UNIQUE (NAME,LOCATION)
);
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'TB_DEPT3';
INSERT INTO TB_DEPT3 VALUES(1,NULL,'1');
INSERT INTO TB_DEPT3 VALUES(2,NULL,'1');
INSERT INTO TB_DEPT3 VALUES(3,NULL,'2');
INSERT INTO TB_DEPT3 VALUES(4,'1','2');
INSERT INTO TB_DEPT3 VALUES(13,'1','1');
INSERT INTO TB_DEPT3 VALUES(14,'2','1');
INSERT INTO TB_DEPT3 VALUES(15,'2','2');
INSERT INTO TB_DEPT3 VALUES(16,'1','2');
select * from TB_DEPT3;

4.3 在修改数据表时添加和删除唯一约束

语法如下

ALTER TABLE <表名> ADD [CONSTRAINTS <约束名称>] UNIQUE (字段1,字段2...字段n);
ALTER TABLE <表名> DROP CONSTRAINTS <约束名称>;

示例10

CREATE TABLE TB_DEPT4 (
  ID NUMBER(11) PRIMARY KEY,
  NAME VARCHAR2(22),
  LOCATION VARCHAR2(50)
);
ALTER TABLE TB_DEPT4 ADD CONSTRAINTS UNIQUE_NAME_LOCATION UNIQUE(NAME,LOCATION);
ALTER TABLE TB_DEPT4 DROP CONSTRAINTS UNIQUE_NAME_LOCATION;
ALTER TABLE TB_DEPT4 ADD UNIQUE(NAME,LOCATION);

总结

UNIQUE 和 PRIMARY KEY区别

UNIQUE 数据表字段中可以拥有多个UNIQUE 字段,但是PRIMARY KEY 只能拥有一个

UNIQUE 数据表字段中可以为NULL,PRIMARY KEY不能为空

5、检查约束 CHECK

5.1 概念

规定每一列能够输入的值,

5.2 语法如下

[CONSTRAINT <约束名称>] CHECK (检查条件)

示例11

CREATE TABLE TB_EMP7 (
    ID NUMBER(11),
    NAME VARCHAR2(25),
    GENDER VARCHAR2(2),
    AGE NUMBER(2),
    PRIMARY KEY(ID),
    CONSTRAINT CHECK_GENDER CHECK (GENDER = '男' OR GENDER = '女')
  );
CREATE TABLE TB_EMP8 (
    ID NUMBER(11),
    NAME VARCHAR2(25),
    GENDER VARCHAR2(2),
    AGE NUMBER(2),
    PRIMARY KEY(ID),
    CHECK (GENDER = '男' OR GENDER = '女')
  );
INSERT INTO TB_EMP7 VALUES(1,'梁自祥','男',30);
INSERT INTO TB_EMP7 VALUES(2,'梁自祥',NULL,30);
INSERT INTO TB_EMP8 VALUES(1,'梁自祥',null,30);--可以null值
INSERT INTO TB_EMP8 VALUES(2,'梁自祥','哈',30);--OCR-02290:违反检查约束条件

5.3 在修改表数据时添加和删除检查约束

语法如下

ALTER TABLE <表名> ADD [CONSTRAINTS <约束名称>[ CHECK (检查条件)
ALTER TABLE <表名> DROP CONSTRAINTS <约束名称>

示例12

CREATE TABLE TB_EMP9 (
    ID NUMBER(11),
    NAME VARCHAR2(25),
    GENDER VARCHAR2(2),
    AGE NUMBER(2),
    PRIMARY KEY(ID)
  );
ALTER TABLE TB_EMP9 ADD CONSTRAINTS CHECK_GENDER_1 CHECK (GENDER = '男' OR GENDER = '女');
ALTER TABLE TB_EMP9 DROP CONSTRAINTS CHECK_GENDER_1;
ALTER TABLE TB_EMP9 ADD CHECK (GENDER = '男' OR GENDER = '女');

总结

CONSTRAINTS <约束名称> 可以省略不写

主键、外键、唯一、检查约束删除语法一致,为 ALTER TABLE <表名> DROP CONSTRAINTS <约束名称>

6、非空约束 NOT NULL CONSTRAINT

6.1 概念

指定的字段不能为空,

6.2 语法如下

字段名 数据类型 NOT NULL

示例13

CREATE TABLE TB_DEPT5 (
  ID NUMBER(11) PRIMARY KEY,
  NAME VARCHAR2(22) NOT NULL ,
  LOCATION VARCHAR2(50)
);
INSERT INTO TB_DEPT5(ID,NAME,LOCATION) VALUES(1,'2','11');
INSERT INTO TB_DEPT5(ID,NAME,LOCATION) VALUES(2,NULL,'11');--ORA-01400:无法将NULL插入
INSERT INTO TB_DEPT5(ID,NAME,LOCATION) VALUES(2,'','11');--ORA-01400:无法将NULL插入

6.3 在修改表数据时添加和删除非空约束

语法如下

ALTER TABLE <表名> MODIFY <字段名> NOT NULL
ALTER TABLE <表名> MODIFY <字段名> NULL*/

示例14

CREATE TABLE TB_DEPT6 (
  ID NUMBER(11) PRIMARY KEY,
  NAME VARCHAR2(22) NOT NULL ,
  LOCATION VARCHAR2(50)
);
DESC TB_DEPT6;
--删除非空约束
ALTER TABLE TB_DEPT6 MODIFY NAME NULL;
INSERT INTO TB_DEPT6(ID,NAME,LOCATION) VALUES(3,NULL,'11');
--添加非空约束
ALTER TABLE TB_DEPT6 MODIFY NAME NOT NULL;--ORA-02296:无法启用非空约束,提示空值,删除数据后重新启用
INSERT INTO TB_DEPT6(ID,NAME,LOCATION) VALUES(3,NULL,'11');--ORA-01400:无法将NULL插入

7、默认约束 DEFAULT CONSTRAINT

7.1 概念

指定字段为空值的时候,系统自动为该字段赋值

7.2 语法如下

字段名 数据类型 DEFAULT 默认值

示例15

CREATE TABLE TB_EMP10 (
    ID NUMBER(11),
    NAME VARCHAR2(25),
    GENDER VARCHAR2(2) DEFAULT '男',
    AGE NUMBER(2),
    PRIMARY KEY(ID)
  );
INSERT INTO TB_EMP10 (ID,NAME,AGE) VALUES(1,'1',1);
INSERT INTO TB_EMP10 VALUES(2,'1',NULL,1);--NULL也属于赋值
SELECT * FROM TB_EMP10;
ALTER TABLE TB_EMP10 MODIFY  GENDER DEFAULT '女';

7.3 在修改表数据时添加和删除默认约束,语法如下

ALTER TABLE <表名> MODIFY <字段名> DEFAULT 默认值
ALTER TABLE <表名> MODIFY <字段名> DEFAULT NULL*/

示例16

--删除默认约束
ALTER TABLE TB_EMP10 MODIFY GENDER DEFAULT NULL;
INSERT INTO TB_EMP10 (ID,NAME,AGE) VALUES(3,'1',1);
SELECT * FROM TB_EMP10;
--添加修改默认约束
ALTER TABLE TB_EMP10 MODIFY  GENDER DEFAULT '男';
INSERT INTO TB_EMP10 (ID,NAME,AGE) VALUES(4,'1',1);
SELECT * FROM TB_EMP10;

8、主键自增约束 GENERATED BY DEFAULT AS IDENTITY

8.1 概念

默认为1,每次插入数据+1

一个数据表中只能有一个字段使用主键自增约束,

8.2 语法如下

备注

cycle 循环 循环的次数必须大于缓存次数

order 排序

字段名 数据类型 <GENERATED BY DEFAULT AS IDENTITY |  GENERATED ALWAYS AS IDENTITY >
    [(
    [START WITH 开始值] [increment by 每次增加] [maxvalue 最大值] [minvalue 最小值] [cycle] [cache 缓存值] [order]
    )]


GENERATED ALWAYS AS IDENTITY  尝试插入或更新 GENERATED ALWAYS AS IDENTITY 列,操作会报错。
GENERATED BY DEFAULT AS IDENTITY  允许你对标识列插入或更新

示例16

CREATE TABLE TB_EMP11 (
    ID NUMBER(11) NOT NULL,
    NAME VARCHAR2(25),
    GENDER VARCHAR2(2) DEFAULT '男',
    id2 NUMBER(2) generated by default as identity (Start with 1 increment by 1 maxvalue 3 minvalue 1 cycle cache 10 order)
  );--ORA-04013:CACSE 值必须少于CYCLE值,此条创建语句明显可以判断出循环3次,缓存10次
CREATE TABLE TB_EMP11 (
    ID NUMBER(11) NOT NULL,
    NAME VARCHAR2(25),
    GENDER VARCHAR2(2) DEFAULT '男',
    id2 NUMBER(2) generated by default as identity (Start with 1 increment by 1 maxvalue 3 minvalue 1 cycle cache 2 order)
  );
INSERT INTO TB_EMP11(id)values('1');--执行9次后查询结果
select * from TB_EMP11;
INSERT INTO TB_EMP11(id,id2)values(4,1);
select * from TB_EMP11;
INSERT INTO TB_EMP11(id)values('1');
select * from TB_EMP11; --明确可以看出id2进行循环并且排序

8.2 修改主键自增约束

语法如下

ALTER TABLE <表名> modify <字段名> <generated as identity | GENERATED ALWAYS AS IDENTITY >
 [(
    [START WITH 开始值] [increment by 每次增加] [maxvalue 最大值] [minvalue 最小值] [cycle] [cache 缓存值] [order]
 )]

示例17

ALTER TABLE TB_EMP11 MODIFY ID2 GENERATED AS IDENTITY (Start with 1 increment by 1 maxvalue 3 minvalue 1 cycle cache 2 );
ALTER TABLE TB_EMP11 MODIFY ID2 GENERATED ALWAYS AS IDENTITY (Start with 1 increment by 1 maxvalue 3 minvalue 1 cycle cache 2 );
INSERT INTO TB_EMP11(id,id2)values(4,1);--ORA-32795:无法插入到 '始终生成' 身份列,可以更改主键自增的类型

总结:

GENERATED ALWAYS AS IDENTITY 可以不指定该列进行插入

GENERATED ALWAYS AS IDENTITY 不能在该列中插入NULL值

GENERATED ALWAYS AS IDENTITY 不能指定具体值插入

GENERATED ALWAYS AS IDENTITY 不能使用update更新该列

GENERATED BY DEFAULT AS IDENTITY 可以不指定该列进行插入

GENERATED BY DEFAULT AS IDENTITY 可以指定具体值插入

GENERATED BY DEFAULT AS IDENTITY 不能在该列中插入null值

GENERATED BY DEFAULT AS IDENTITY 可以使用update更新该列,但不能更新为NUL

8.3 在修改表数据时添加和删除自增约束

语法如下(不能在创建好的字段上进行修改,oracle不允许)

ALTER TABLE <表名> ADD <字段名> (数据类型) <generated as identity | GENERATED ALWAYS AS IDENTITY >
 [(
    [START WITH 开始值] [increment by 每次增加] [maxvalue 最大值] [minvalue 最小值] [cycle] [cache 缓存值] [order]
 )]

ALTER TABLE <表名> MODIFY <字段名> DROP identity

示例18

alter table TB_EMP11 add id3 NUMBER(2) 
        generated by default as identity 
        (start with 11 increment by 2 maxvalue 100000 minvalue 10);--ORA-30669:表名只有一个身份列
--删除
alter table TB_EMP11 modify id2 drop identity;
--增加
alter table TB_EMP11 add id3 NUMBER(2) 
        generated by default as identity 
        (start with 11 increment by 2 maxvalue 100000 minvalue 10);
--数据迁移
update TB_EMP11 set id3=id2;
--删除原有字段
alter table TB_EMP11 drop column id2;
--修改字段名称
alter table TB_EMP11 rename column id3 to ID2

掌握知识

7种约束 主键 外键 唯一 检查 非空 默认 自增 熟练掌握增删改查的操作 DDL数据定义语言

9、查询数据表结构,

9.1 语法如下

DESCRIBE <表名> 或者简写 DESC <表名>

示例19

DESCRIBE TB_EMP11;
DESC TB_EMP11;

10、修改表名,

10. 1 语法如下

ALTER TABLE <旧表名> RENAME TO <新表明>

示例20

ALTER TABLE TB_DEPT3 RENAME TO TB_DEPTMENT3;

11、修改字段类型

11.1 语法如下

ALTER TABLE <表名> MODIFY <字段名> <数据类型>

示例21

ALTER TABLE TB_DEPT MODIFY NAME VARCHAR2(255);
ALTER TABLE TB_DEPT MODIFY NAME VARCHAR2(25);

12、修改字段名称

12.1 语法如下

ALTER TABLE <表名> rename column <旧字段名> TO <新字段名>

示例22

ALTER TABLE TB_DEPT RENAME column LOCATION TO LOC;

13、添加字段

13.1 语法如下

ALTER TABLE <表名> ADD <字段名> <数据类型> [列级别约束条件]

示例23

ALTER TABLE TB_DEPT ADD ID3 NUMBER generated by default as identity (start with 11 increment by 2 maxvalue 100000 minvalue 10);

14、删除字段

14.1 语法如下

ALTER TABLE <表名> DROP column  <字段> cascade cibstraints: 将该字段相关的约束一并删除*/

示例24

ALTER TABLE TB_DEPT DROP COLUMN ID3 ;

15、删除数据表

15.1 删除没有被关联的数据表,语法如下

DROP TABLE <表名>

示例25

DROP TABLE TB_DEPT;

15.2 删除被其他表关联的主表

示例26

CREATE TABLE TB_DEPT(
       ID NUMBER(11) PRIMARY KEY,
       NAME VARCHAR2(55),
       loc varchar2(255)
);
CREATE TABLE TB_EMP (
       ID NUMBER(11),
       NAME VARCHAR2(55),
       DEPTID NUMBER(11),
       salary NUMBER(10,2),
       constraint fk_emp_dept FOREIGN KEY (DEPTID) REFERENCES TB_DEPT(ID)
);
DROP TABLE TB_DEPT;--ORA-02449:标准的唯一/主键被外键使用
--移除从表的外键约束
ALTER table TB_EMP DROP constraints fk_emp_dept;
DROP TABLE TB_DEPT;

猜你喜欢

转载自blog.csdn.net/liang921119/article/details/129455145