用户登录
用户注册

分享至

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

  • 作者: 赵小磊子
  • 来源: 51数据库
  • 2021-10-19

oracle和sqlserver两者的增删改查介绍和区别

create table class--下面要引用外键联系classno来知道classname
(
       classno int primary key,
       classname varchar(50)
)

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

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

一:

oracle:
create table student
(
       stuno number(8) not null constraint  pk_stuno primary key,--主键约束
       stuname varchar2(16) default 'jack',--默认约束
       classno number(8) constraint fk_class_student references class(classno),--外键约束
       stuid varchar2(18) constraint uq_stuid unique,--唯一约束
       stusex varchar2(4) constraint ck_stusex check(stusex in('帅哥','美女')),--检查约束
       stuage number(3) constraint ck_stuage check(stuage<100 and stuage>10)--检查约束
)

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

stusex varchar2(4) constraint ck_stusex check(stusex='帅哥' or stusex='美女'),

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

其实我们一般这样写:

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

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

constraint  pk_stuno primary key(stuno),
constraint fk_class_student foreign key(classno) references  classq2(classno)),
classno number(8) foreign key references classq2(classno),

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

对了,复习下:

表完整性:

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

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

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

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

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

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

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

接着,我们一般这样写

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

建外键约束 可以

classno int references class(classno),

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

注:在oracle里可以用int和varchar,在sqlserver里不可用number和varchar2

二:

oracle:

alter table student add constraint pk_stunoq primary key(stuno);--建主键约束
alter table student add constraint fk_classq_studentq foreign key(classno)references class(classno);--外键约束
alter table student add constraint ck_stuageq check(stuage<100 and stuage>10);--检查约束

删除约束:

在oracle:

alter table student drop primary key;--删除该表所有主键约束 (1)
alter table student drop constraint pk_stuno;--删除该表指定字段的主键约束  (2)
alter table student drop constraint  ck_stuage;--删除检查约束
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"代替掉咯,要是执行select * from view_tables;时弹出"表或视图不存在"提示,就是表示没有view视图的table

软件
前端设计
程序设计
Java相关