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