电脑疯子技术论坛|电脑极客社区

微信扫一扫 分享朋友圈

已有 2054 人浏览分享

Oracle和SQLServer两者的增删改查介绍和区别

[复制链接]
2054 0
本帖最后由 zhaorong 于 2018-6-12 12:24 编辑

Oracle和SQLServer两者的增删改查介绍和区别

  1. create table class--下面要引用外键联系classno来知道classname
  2. (
  3.        classno int primary key,
  4.        classname varchar(50)
  5. )
复制代码


创建主键、外键、唯一、检查约束是分两种(我执行过的默认约束只有字段级别的执行成功):

一是在建表时(字段级别的) 二是在建表后(表级别的)

一:


Oracle:

  1. create table student
  2. (
  3.        stuno number(8) not null constraint  pk_stuno primary key,--主键约束
  4.        stuname varchar2(16) default 'Jack',--默认约束
  5.        classno number(8) constraint fk_class_student references class(classno),--外键约束
  6.        stuid varchar2(18) constraint uq_stuid unique,--唯一约束
  7.        stusex varchar2(4) constraint ck_stusex check(stusex in('帅哥','美女')),--检查约束
  8.        stuage number(3) constraint ck_stuage check(stuage<100 and stuage>10)--检查约束
  9. )
复制代码


stusex字段创建检查约束也可以是:

  1. stusex varchar2(4) constraint ck_stusex check(stusex='帅哥' or stusex='美女'),
复制代码


(这个虽然可以,但可能不方便,因为当你不止'帅哥''美女'两个范围的词时,用in是最好不过了,in后的括号里的
值用逗号分隔即可,对了,补充下:一个字占两个字节或长度,字母、数字、
符号都占一个字节或者长度,最基础的啦)

其实我们一般这样写:

  1. create table student
  2. (
  3.        stuno number(8) not null primary key,--主键约束
  4.        stuname varchar2(16) default 'Jack',--默认约束
  5.        classno number(8)  references class(classno),--外键约束
  6.        stuid varchar2(18) unique,--唯一约束
  7.        stusex varchar2(4) check(stusex='帅哥' or stusex='美女'),--检查约束
  8.        stuage number(3) check(stuage<100 and stuage>10)--检查约束
  9. )
复制代码


不过这样的话,主键、外键、唯一、检查约束名就需要系统随机分配名了,当你想删除主键约束时,将会变得
不方便,因为你不知道名字,若你要找约束名字(我会在文章最后部分说到“如何找约束名”),当找到
名字了,名字将会很长,你还不如用第一种的,自己起个名字简短并易认出(名字随便取,自己认得出就行,最好
别人也认得出啦),也就多加那几个英文单词而已啦!!!(不偷懒,就是方便自己。。。随便啦)建表
时字段里不能这样写:

  1. constraint  pk_stuno primary key(stuno),
  2. constraint fk_class_student foreign key(classno) references  classQ2(classno)),
  3. classno number(8) foreign key references classQ2(classno),
复制代码


分析上面三句语句:第一句和第二句都没有指定数据类型,而且字段名要写在前面,第三句,会报错

2018061109562132.png



对了,复习下:

表完整性:

1,实体完整性:主键约束,保证数据唯一性

2,域完整性:字段规则,如性别必须是男或女,年龄在0-200

3,参照完整性:外键约束,外键对应的记录必须存在

主键和唯一约束:记录或数据都是唯一的,不重复的;但主键自动not null,而唯一可以null.

外键约束:一般联系的是外表的主键字段,字段的数据类型必须与外键对应字段的数据类型一样,长度可以不同.

SQLServer:(那三种默认约束,也是可以用在Oracle中)


  1. create table student
  2. (
  3.        stuno int not null constraint  pk_stuno primary key,--主键约束
  4.        stuname varchar(10) default 'Tony',--字符串的默认约束
  5.        schooltime date default '2018-9-8 17:00',--时间的默认约束
  6.        classno int constraint fk_class_student references class(classno),--外键约束
  7.        email int default 9,--整型的默认约束
  8.        stuid varchar(18) constraint uq_stuid unique,--唯一约束
  9.        stusex varchar(4) constraint ck_stusex check(stusex in('帅哥','美女')),--检查约束
  10.        stuage int constraint ck_stuage check(stuage<100 and stuage>10)--检查约束
  11. )
复制代码


接着,我们一般这样写


  1. create table student
  2. (
  3.        stuno int primary key,--主键约束
  4.        stuname varchar(10) default 'Tony',--字符串的默认约束
  5.        schooltime date default '2018-9-8 17:00',--时间的默认约束
  6.        classno int foreign key references class(classno),--外键约束
  7.        email int DEFAULT 1001,--整型的默认约束
  8.        stuid varchar(18) unique,--唯一约束
  9.        stusex varchar(4) check(stusex in('帅哥','美女')),--检查约束
  10.        stuage int check(stuage<100 and stuage>10)--检查约束
  11. )
复制代码


建外键约束 可以

  1. classno int references class(classno),
复制代码


正如上面所说的:为了删除约束,第一种更好些

:在Oracle里可以用int和varchar,在SQLServer里不可用number和varchar2

二:

Oracle:

  1. alter table student add constraint pk_stunoQ primary key(stuno);--建主键约束
  2. alter table student add constraint fk_classQ_studentQ foreign key(classno)refer
  3. ences class(classno);--外键约束
  4. alter table student add constraint ck_stuageQ check(stuage<100 and stuage>10);--检查约束
复制代码


删除约束:

在Oracle:

  1. alter table student drop primary key;--删除该表所有主键约束 (1)
  2. alter table student drop constraint pk_stuno;--删除该表指定字段的主键约束  (2)
  3. alter table student drop constraint  ck_stuage;--删除检查约束
  4. alter table student drop constraint fk_classQ_studentQ;--删除外键约束
复制代码

也可以:

alter table 表名 drop constraint pk_stuno/约束名 cascade;

在SQLServer:

alter table student/表名 drop constraint pk_stuno/约束名;

在mysql:

--1)删除主键约束:

alter table 表名 drop primary key;

--2)删除外键约束:

alter table 表名 drop foreign key 外键(区分大小写)

完整系列:

ALTER [ignore] TABLE tbl_name alter_specification [,alter_specification] ...
alter_specification: table_option ...
/ADD [column] column_definition [first/after col_name ] --新增字段
/ ADD [COLUMN](column_definition,...) --新增字段
/ ADD {INDEX|KEY} [index_name] [index_type](index_col_name,...) --新增索引
/ ADD [constraint[symbol]] PRIMARY KEY [index_type] (index_col_name,...) --新增主键约束
/ ADD [CONSTRAINT[symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...) --新增唯一约束
/ ADD [fulltext/spatial] [INDEX|KEY] [index_name] (index_col_name,...) --新增索引
/ ADD [CONSTRAINT[symbol]] FOREIGN KEY [index_name] (index_col_name,...) [reference_definition] --新增外键约束
/ ALTER [COLUMN]col_name {SET DEFAULT literal | DROP DEFAULT} --建默认值
/change [COLUMN] old_col_name column_definition [FIRST|AFTER col_name] --改旧字段名
/ modify [COLUMN]column_definition [FIRST | AFTER col_name] --修改字段类型或长度
/ DROP [COLUMN] col_name --删字段
/ DROP PRIMARY KEY --删主键
/ DROP {INDEX|KEY} index_name --删索引
/ DROP FOREIGN KEY fk_symbol --删外键
/ disable KEYS | enable KEYS | rename [TO] new_tbl_name --对键的禁用启用重命名
/ order BY col_name [, col_name] ...
/ convert TO characterset charset_name [COLLATE collation_name]
/ [DEFAULT] CHARACTERSET charset_name [COLLATE collation_name]
/ discard tablespace
/ import tablespace

最后:

在SQLServer里: sp_helpconstraint STUDENT/表名; --找到数据表中的所有列的约束

在Oracle里:
在Command Window命令窗口里执行: desc student;--查询表的结构(查看是否为空,数据类型和长度)
无须在命令窗口执行:(一个不带条件,一个带"表名为什么"的条件)
select constraint_name,table_name,constraint_type from user_constraints
select table_name,constraint_name,constraint_type from user_constraints where
table_name='STUDENT/大写的表名';
其实也可以直接 select * from user_constraints
(用user_constrains表来获取当前用户的约束,用all_constraints来获取所以用户的约束还包含了表的约束信息)
还可以查询索引表
select * fromUSER_INDEXES;
类似的,有序列表USER_SEQUENCES,触发器表USER_TRIGGERS,存储过程表USER_PROCEDURES,
还有USER_TABLES,VIEW_TABLES 等。也就是将"USER_INDEXES"代替掉咯,要是执行sele
ct * from view_tables;时弹出"表或视图不存在"提示,就是表示没有view视图的table





您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

关注

0

粉丝

9021

主题
精彩推荐
热门资讯
网友晒图
图文推荐

Powered by Pcgho! X3.4

© 2008-2022 Pcgho Inc.