Oracle和SQLServer的增删改查和某些区别

版权声明:本文为博主原创文章,未经博主允许不得转载。谢谢合作~ https://blog.csdn.net/qq_41042595/article/details/80643748

一下午花在查看约束名和删除约束名,反反复复的执行,就为看看其中的区别,(借鉴CSDN用户jkqiang885和a154832918,还借鉴了百度知道)

现在做个笔记,顺便写入创建约束,方便查看!!!

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:

       --⒈删除主键约束:

alter table 表名 drop primary key;
       --⒉删除外键约束:

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 * from USER_INDEXES;

类似的,有序列表USER_SEQUENCES,触发器表USER_TRIGGERS,存储过程表USER_PROCEDURES,还有USER_TABLES,VIEW_TABLES 等。也就是将"USER_INDEXES"代替掉咯,要是执行select * from view_tables;时弹出"表或视图不存在"提示,就是表示没有view视图的table

猜你喜欢

转载自blog.csdn.net/qq_41042595/article/details/80643748