《SQL Server 2010从入门到明白》--20180629

来源:http://www.mnuet.com 作者:广东十一选五走势图 人气:53 发布时间:2019-10-16
摘要:约束 主关键字约束(Primary Key Constraint) 用来钦点表中的一列或几列组合的值在表中负有独一性。建构主键的指标是让外键来援引。 Primary Key的创始形式 在创制表时创办Primary Key CREAT

约束

主关键字约束(Primary Key Constraint)

用来钦点表中的一列或几列组合的值在表中负有独一性。建构主键的指标是让外键来援引。

Primary Key的创始形式

在创制表时创办Primary Key

CREATE TABLE table1(
    t_id VARCHAR(12) ,
    t_name VARCHAR(20),
    t_phone VARCHAR(20),
    CONSTRAINT t_idss PRIMARY KEY(t_id)
);

对t_id列创建主键,约束名叫t_idss。

删除Primary Key
ALTER TABLE table1
DROP CONSTRAINT t_idss;

自律名与列名不均等,此处填写约束名

向已有表中加多Primary Key
ALTER TABLE table1
ADD CONSTRAINT t_idss
PRIMARY KEY(t_id);
累积Primary Key的另一种示例
ALTER TABLE Products
ADD PRIMARY KEY(prod_id);

纵然上述代码运维没难点,查看表格设计也得以见到Primary Key设置成功,不过在剔除Primary Key操作时会提示:
消息3728,级别16,状态1,第1 行
'prod_id' 不是封锁。
消息3727,级别16,状态0,第1 行
不许删除约束。请参阅前边的错误新闻。
原因是充分Primary Key语句中向来不用CONSTRAINT指明约束名,系统自动生成了主键名和平公约束名,要先查看主键名和约束名,删除时填写的也是束缚名。
这种气象的不利删除方法

ALTER TABLE Products
DROP CONSTRAINT CK__Products__prod_p__1A14E395;
ALTER TABLE Products
DROP CONSTRAINT PK__Products__56958AB222AA2996;
多列组合加多主键约束
CREATE TABLE table1(
    t_id VARCHAR(12),
    s_id VARCHAR(20),
    score FLOAT,
    CONSTRAINT ts_id PRIMARY KEY(t_id,s_id)
);
外关键字约束(Foreign Key Constraint)

概念了表之间的关系,用来维护七个表之间的一致性的涉嫌。
在成立表时开创Foreign Key Constraint

CREATE TABLE table2(
    s_id VARCHAR(20),
    s_name VARCHAR(12),
    s_tellphone VARCHAR(11),
    s_address VARCHAR(20),
    CONSTRAINT PK_s_id PRIMARY KEY(s_id),
);--首先新建table2,设置s_id为主键

CREATE TABLE table1(
    t_id VARCHAR(12),
    s_id VARCHAR(20),
    score FLOAT,
    CONSTRAINT pk_ts_id PRIMARY KEY(t_id,s_id),--新建table1,对t_id和s_id设置联合主键,键名pk_ts_id
    CONSTRAINT fk_s_id FOREIGN KEY(s_id)--对s_id设置外键fk_s_id
    REFERENCES table2(s_id)--外键fk_s_id外键关联table2的列s_id
    ON DELETE CASCADE--设置在table1的s_id删除时table2的s_id同时删除
    ON UPDATE CASCADE--设置在table1的s_id更新时table2的s_id同时更新
);

注:对table1设置外键关联table2,在插入数据时索要先插入table2的多寡,才具不负职责插入table1的多寡。退换table2.s_id数据,table1.s_id数据也会自行退换。不过更动table1.s_id数据,试行时报外键冲突。综上说述对table1设置外键关联table2后,table1的数据跟着table2走,无法反着来。

增添和删除却键约束同主键。

UNIQUE约束

除主键外另一种能够定义独一约束的档案的次序,允许空值。增加UNIQUE的法子同上,这里只简单比方。

USE test
GO
ALTER TABLE table2
ADD CONSTRAINT uk_s_tellphone
UNIQUE(s_tellphone);
CHECK约束

分为表约束和列约束,用于限制字段值在某些范围。

添加CHECK约束
ALTER TABLE table2
ADD sex CHAR(2);--在table表中添加sex,数据类型为CHAR,用来存放性别
GO
ALTER TABLE table2
ADD CONSTRAINT ck_sex CHECK(sex in('男','女'));

注:此时sex列数据类型不能是bit,假诺填写bit,只好存款和储蓄0和1,用CHECK约束限制结果为男和女就可以报错。

在成立表的时候增加CHECK 约束
CREATE TABLE table3(
    t3_id VARCHAR(12),
    t3_name VARCHAR(20),
    t3_class VARCHAR(12),
    t3_type VARCHAR(12),
    CONSTRAINT ck_t3_type CHECK(t3_type in('类型1','类型2','类型3')) 
)

加多了自律后只要插入不符合约束的数量

INSERT INTO table3(
    t3_id,
    t3_name,
    t3_class,
    t3_type
)VALUES(
'2018038219',
'李建',
'社会与科学',
'任何数据'
);

消息547,级别16,状态0,第1 行
INSERT 语句与CHECK 约束"ck_t3_type"冲突。该冲突时有发生于数据库"test",表"dbo.table3", column 't3_type'。
讲话已偃旗息鼓。

删除CHECK约束
ALTER TABLE table3
DROP CONSTRAINT ck_t3_type;
DEFAULT约束

通过定义列的暗中认可值或选拔数据库的暗许值对象绑定表列,来钦定列的暗中同意值。

在建表时增加DEFAULT约束
CREATE TABLE table3(
    t3_id VARCHAR(12),
    t3_name VARCHAR(20),
    t3_class VARCHAR(12),
    t3_type VARCHAR(12) DEFAULT '类型1' 
)
删除DEFAULT约束
ALTER TABLE table3
DROP CONSTRAINT DF__table3__t3_type__3D5E1FD2;
--DF__table3__t3_type__3D5E1FD2是DEFAULT约束的约束名
丰富封锁不点名约束名
ALTER TABLE table3
ADD DEFAULT '类型2' FOR t3_type;
GO
加多封锁钦赐约束名
ALTER TABLE table3
ADD CONSTRAINT df_t3_type
DEFAULT '类型2' FOR t3_type;
GO
NOT NULL约束

封锁字段值不为空。

建表时设置NOT NULL约束
CREATE TABLE table3(
    t3_id VARCHAR(12) NOT NULL,
    t3_name VARCHAR(20) NOT NULL,
    t3_class VARCHAR(12) NOT NULL,
    t3_type VARCHAR(12) NOT NULL 
)
为已存在的列增多NOT NULL约束
ALTER TABLE table3
ALTER COLUMN t3_type VARCHAR(12) NOT NULL;
删除NOT NULL约束
ALTER TABLE table3
ALTER COLUMN t3_type VARCHAR(12) NULL;
GO

自定义默许值对象保险数据完整性

CREATE DEFAULT date_today AS GETDATE();
--新建默认值对象名date_today,默认值为getdate()函数,获取当前日期
GO
EXEC sp_addtype date_time,'date','NULL';
--利用存储过程新建自定义数据类型date_time,参照系统数据类型date
GO
EXEC sp_bindefault 'date_today','date_time';
--将默认值对象date_today绑定到自定义数据类型date_time上
GO
CREATE TABLE table3(--新建table3,设置字段t3_date的数据类型为date_time
    t3_id VARCHAR(12),
    t3_name VARCHAR(20),
    t3_class VARCHAR(12),
    t3_type VARCHAR(12),
    t3_date date_time
);
GO
INSERT INTO table3(--为新建表table3插入一条数据,不指定t3_date的值,看默认值是否有效
    t3_id,
    t3_name,
    t3_class,
    t3_type
)VALUES(
'2018038220',
'李建',
'社会与科学',
'类型1'
);
GO
SELECT * FROM table3;--查询table3数据,看t3_date是否有默认值为当前日期

查询结果如下
图片 1

ALTER TABLE table3
ADD t3_date1 DATE;--在table3表中新增一列t3_date1,数据类型为DATE
GO
EXEC sp_bindefault 'date_today','table3.t3_date1';
--直接将默认值对象date_today绑定到table3的t3_date1列
GO
INSERT INTO table3(--为新建表table3插入一条数据,不指定t3_date和t3_date1的值,看默认值是否有效
    t3_id,
    t3_name,
    t3_class,
    t3_type
)VALUES(
'2018038221',
'李建',
'社会与科学',
'类型'
);
GO
SELECT * FROM table3;
GO

查询结果如下
图片 2

仓库储存进度查询默许值对象的持有者
USE test
EXEC sp_help date_today;
GO

结果如图所示
图片 3

剔除暗中同意值对象
DROP DEFAULT date_today;

除去不成事,提醒以下信息:
消息3716,级别16,状态3,第1 行
不能够删除暗许值'date_today',因为它已绑定到贰个或八个列。
那就是说大家驾驭,当贰个暗中认可值对象绑定了列其后,就不恐怕删除它,假诺想要删除,就亟须先解绑。在上面包车型大巴操作中,大家的暗中认可值对象date_today绑定了test数据库table3表的t3_date1字段。

对列解绑暗许值对象
USE test
GO
EXEC sp_unbindefault 'table3.t3_date1';

那时我们再次尝试删除暗中同意值对象,开掘依旧分外,此时要留意,在地点的操作中,默许值对象date_today不仅绑定了t3_date1列,还绑定了自定义数据类型date_time,并将该数据类型定义给了t3_date列,大家还亟需对date_time解绑私下认可值对象。

EXEC sp_unbindefault 'date_time';

此刻再也删除私下认可值对象,就能够成功删除。删除暗许值对象后,原先绑定的字段不会再有私下认可值。

自定义准则维护数据完整性

准则是对列或自定义数据类型的值的显明和限制。自定义法规的说明式应当要回到布尔类型的值,何况表达式中不可能包罗七个变量。

CREATE RULE score_rule AS @math_score>=0;
GO--新建规则score_rule,参数@math_score
EXEC sp_addtype 'score_type','float','NULL';
GO--新建自定义数据类型score_type
CREATE TABLE table_score(--新建表table_score,预设mt_score和at_score字段用于绑定规则
s_id VARCHAR(4),
s_name VARCHAR(10),
mt_score float,--该字段将用于规则score_rule绑定到列
at_score score_type--该字段将用于规则score_rule绑定到自定义数据类型
);
GO
EXEC sp_bindrule 'score_rule','score_type';
GO--将score_rule规则绑定到自定义数据类型score_type
EXEC sp_bindrule 'score_rule','table_score.mt_score';
GO--将score_rule规则绑定到table_score表的mt_score列

----以下进行规则测试
INSERT INTO table_score(
s_id,
s_name,
mt_score,
at_score
)VALUES(
'0001',
'张华',
'-1',
'-1'
);
GO

张开违反法规的插入后,数据库报错
消息513,级别16,状态0,第1 行
列的插入或更新与以前的CREATE RULE 语句所钦赐的准则发生冲突。该语句已终止。冲突爆发于数据库'test',表'dbo.table_score',列'mt_score'。
言辞已甘休。
很明显,mt_score的插入值为-1,违反了必需高于等于0的平整,数据库报错。将mt_score的插入值改成相符法规的多少,再度运转插入语句,数据库照旧会报错,因为at_score字段的插入值也是违背法规的。将三个数据改成符合准则的回来,实践成功。

注:新建法则时表达式必需假如回来布尔类型的值,否则会报错

消息4145,级别15,状态1,过程sum_score,第1 行
在应利用标准的上下文(在';' 周围)中钦命了非布尔类型的表明式。

删去自定义法则

和自定义私下认可值对象一样,删除自定义法则须求该准绳先与字段和自定义数据类型解绑。在上头的操作中,score_rule准绳与自定义数据类型score_type以及列mt_score已绑定。由此实行以下语句:

EXEC sp_unbindrule 'score_type';
GO--解除规则score_rule与score_type之间的绑定
EXEC sp_unbindrule 'table_score.mt_score';
GO--解除规则score_rule与表table_score的mt_score列的绑定
DROP RULE score_rule;--删除score_rule规则

注:经过试验,八个列只可以绑定1条准绳,假如对贰个列绑定2条准则,前一条法规会被后一条准绳顶替。

翻开自定义准则
EXEC sp_help 'score_rule';

结果如图所示
图片 4

查看自定义法则的定义新闻
EXEC sp_helptext 'score_rule';
GO

结果如图所示
图片 5

本文由广东十一选五一定牛发布于广东十一选五走势图,转载请注明出处:《SQL Server 2010从入门到明白》--20180629

关键词:

上一篇:没有了

下一篇:mysql 开发进阶篇系列 15 锁问题 (总结)

最火资讯