SQLServer 重命名所有外键约束
- 格式:docx
- 大小:19.59 KB
- 文档页数:2
SQLServer - 约束在SQLServer中,有3种不同类型的约束。
1、实体约束实体约束是关于行的,比如某一行出现的值就不允许出现在其他行,例如主键。
2、域约束域约束是关于列的,对于所有行,某一列有那些约束,例如CHECK约束。
3、参照完整性约束如果某列的值必须与其他列的值匹配,那就意味着需要一个参照完整性约束,例如外键。
在学习约束之前,首先来了解下为约束命名需要注意哪些地方。
SQLServer在我们不提供名称时,会自动创建名称,但是由系统自动创建的名称并不是特别有用。
例如,系统生成的主键名称可能是这样的:PK_Employees_145C0A3F。
PK代表主键(primary key),Employees代表在Employees表中,而剩下的“145C0A3F”部分是为了保证唯一性而随机生成的值。
只有通过脚本创建才会得到这种值,如果是通过Managerment Studio创建表,那么就直接是PK_Employees。
对于系统自动生成的Check约束名称如:CK_Customers_22AA2996。
CK代表这是一个Check约束,Customers代表是在Customers表中,后面的22AA2996还是一个随机数。
如果一个表中有多个Check约束,则命名可能如下:CK_Customers_22AA2996CK_Customers_25869641CK_Customers_267ABA7A如果你需要修改这些约束其中的一个,那么你很难分辨这些约束到底是哪一个。
因此,为了能够一眼看上去就知道这个约束是用来干什么的,我们应该使用一种简单明了的短语来进行命名。
例如要确保某一列电话号码格式正确的约束,我们可以使用命名CK_Customers_PhoneNo这样的短语来命名。
总之命名要做到以下几点:1、一致性2、通俗易懂3、满足以上两个条件的情况下简化名称。
1、主键约束主键是每行的唯一标识符,仅仅通过它就能准确定位到一行,其中主键列在整个表中不能有重复,必须包含唯一的值(不能为NULL)。
简述 sql server 中的七大约束。
SQL Server是一种流行的关系型数据库管理系统(RDBMS),它可以帮助开发人员快速、高效地管理和检索数据。
在SQL Server中,约束是一种用于保证数据完整性和一致性的机制。
本文将简要介绍SQL Server中的七大约束。
1. 主键约束主键约束是指在关系表中唯一标识每个记录的一个或多个字段。
主键必须是唯一的、非空的,并且不允许重复值。
主键约束可以确保每个记录都可以轻松地识别和访问。
2. 外键约束外键约束是指在一个表(称为“子表”)中引用另一个表(称为“父表”)中主键的字段。
外键约束可以确保引用其他表中的数据时不会破坏数据完整性和一致性。
3. 唯一约束唯一约束是指在一个或多个字段上强制唯一性的约束。
唯一约束与主键的区别在于它们不必成为每行的唯一标识符。
唯一约束可以确保特定字段或字段组合中的数据是唯一的。
4. 非空约束非空约束是指在一个或多个字段上强制不允许为空的约束。
这个约束可以确保插入、更新或删除记录时不会造成无效的数据状态。
5. 检查约束检查约束是指在一个或多个字段上定义了一个表达式,该表达式必须返回TRUE,否则不允许插入、更新或删除记录。
检查约束可以用于对数据类型、域、值范围和格式的限制。
6. 数据默认值约束数据默认值约束是指在一个或多个字段上定义了默认值,如果插入记录时没有指定该字段的值,则使用默认值。
数据默认值约束可以确保某些字段始终具有特定的默认值。
7. 限制约束限制约束是一种指定插入、更新或删除操作条件的高级约束。
限制约束可以使用特定的条件表达式来限制某一类操作,例如要求用户输入密码验证或工作时间窗口。
总的来说,在SQL Server中使用约束可以提高数据完整性和一致性,减少错误和数据损坏的可能性。
理解并使用这七种约束将有助于优化数据库设计,并确保数据库系统得到最佳的性能和可靠性。
SQL Server中约束的介绍摘要对于SQL Server中的约束,想必大家并不是很陌生。
但是约束中真正的内涵是什么,并不是很多人都很清楚的。
本文以详细的文字来介绍了什么是约束,以及如何在数据库编程中应用和使用这些约束,来达到更好的编程效果。
(本文部分内容参考了SQL Server联机手册)内容数据完整性分类实体完整性域完整性引用完整性用户定义完整性PRIMARY KEY约束DEFAULT约束CHECK约束UNIQUE约束FOREIGN KEY约束正文在数据库管理系统中,保证数据库中的数据完整性是非常重要的。
所谓数据完整性,就是指存储在数据库中数据的一致性和正确性。
约束定义关于列中允许值的规则,是强制完整性的标准机制。
使用约束优先于使用触发器、规则和默认值。
查询优化器也使用约束定义生成高性能的查询执行计划。
SQL Server联机丛书中,将数据完整性解释如下:“存储在数据库中的所有数据值均正确的状态。
如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性。
”强制数据完整性可确保数据库中的数据质量。
例如,如果输入了employee_id 值为123 的职员,那么该数据库不应允许其他职员使用同一ID 值。
如果计划将employee_rating 列的值范围设定为从 1 到5,则数据库不应接受6。
如果表有一dept_id 列,该列存储职员的部门编号,则数据库应只允许接受公司中的有效部门编号。
数据完整性分类在SQL Server中,根据数据完整新措施所作用的数据库对象和范围不同,可以将数据完整性分为以下几种。
实体完整性域完整性引用完整性用户定义完整性SQL Server联机丛书中指明:“对表进行计划有两个重要步骤:标识列的有效值和确定如何强制列中的数据完整性。
”实体完整性实体完整性简单的说,就是将表中的每一行看作一个实体。
实体完整性要求表的标示符列或主键的完整性。
可以通过建立唯一索引、PRIMARY KEY约束、UNIQUE约束,以及列的IDENTITY属性来实施实体完整性。
Microsoft SQL Server2005中定义约束及删除约束为了保证输入数据的正确性,必须要在创建表的时候设置约束, 在这里首先简单的介绍一下如何设置约束:(需要注意的是,在用Management Studio创建约束的时候,在修改完后,都需要保存表以保存修改。
)1. Microsoft SQL Server 2005中有五种约束,分别是 CHECK约束, DEFAULE 约束,PRIMARY KEY约束,FROEIGN KE约束, UNIQUE约束.(1) CHECK约束:用来限制输入一列或者多列的值的范围,通过逻辑表达式来判断数据的有效性,也就是一个列的输入内容必须满足CHECK约束条件,否则,数据无法正常输入,从而强制数据的域的完整性.(2) DEFAULT约束若在表中定义了DEFAULT约束,用户在插入新的数据时,如果该列没有指定数据,那么系统将默认值赋给该列,默认值也可以为空.(3) PRIMARY KEY约束在表中经常有一列或多列的组合,其值能在唯一标识表中每一行. 这样的一列或多列成为表的主健(Primary Key),通过它可以强制表的实体完整性。
一个表只能有一个主键,而且主键不能为空值。
(4) FOREIGN KEY约束外键(foreign key)是用于建立和加强两个表(主表与从表)的列或多列数据之间的连接的,当添加,修改或者删除数据时,通过参照完整性来保证它们之间的数据的一致性。
先定义主键,再对从表定义外键约束。
(5)UNIQUE 约束UNIQUE约束用于确保表中的两个数据行在非主键中没有相同的列值,与PRIMARY KEY 约束类似,UNIQUE约束也强制唯一性,为表中的一列或多列提供实体完整性.但 UNIQUE用于非主键的一列或多列组合,且一个表可以定义多个UNIQUE约束.2.约束的创建,查看,删除(即可以通过SQL SERVER Management Studio的“对象资源管理器”面板进行,也可通过T-SQL进行.)(1) CHECK 约束:通过Management Studio设置,设置性别只能输入‘男’,或者‘女’首先打开表的列,右键点击‘性别’,选择 CHECK 约束如下图在表达式里输入:性别='男' or 性别='女',点关闭即可。
SQL Server 外键约束的例子外键约束的测试表与测试数据-- 创建测试主表. ID 是主键.CREATE TABLE test_main (id INT,value VARCHAR(10),PRIMARY KEY(id));-- 创建测试子表.CREATE TABLE test_sub (id INT,main_id INT,value VARCHAR(10),PRIMARY KEY(id));-- 插入测试主表数据.INSERT INTO test_main(id, value) VALUES (1, 'ONE');INSERT INTO test_main(id, value) VALUES (2, 'TWO');-- 插入测试子表数据.INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');默认外键约束方式1> ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (ma in_id) REFERENCES test_main;2> go1> DELETE2> test_main3> WHERE4> ID = 1;5> go消息 547,级别 16,状态 1,服务器 HOME-BED592453C\SQLEXPRESS,第 1 行DELETE 语句与 REFERENCE 约束"main_id_cons"冲突。
该冲突发生于数据库"Stock",表"db o.test_sub", column 'main_id'。
SQLServer主键、外键、唯⼀等约束主键(primary key)约束、外键(foreign key)约束、唯⼀(unique)约束、检查(check)约束、默认值(default)约束实例Oracle 有如下类型的约束:NOT NULL(⾮空)、UNIQUE Key(唯⼀约束)、PRIMARY KEY(主键约束)、FOREIGN KEY(外键约束)、CHECK约束Oracle使⽤SYS_Cn格式命名约束.创建约束:在建表的同时创建、建表后创建约束的类型有如下⼏种:C (check constraint on a table)P (primary key)U (unique key)R (Referential AKA Foreign Key)V (with check option, on a view)O (with read only, on a view)1、创建约束CREATE TABLE students(student_id VARCHAR2(10) NOT NULL,student_name VARCHAR2(30) NOT NULL,college_major VARCHAR2(15) NOT NULL,status VARCHAR2(20) NOT NULL,state VARCHAR2(2),license_no VARCHAR2(30)) TABLESPACE student_data;2、创建主键:ALTER TABLE students ADD CONSTRAINT pk_students PRIMARY KEY (student_id)USING INDEX TABLESPACE student_index;Alter table table_name add constrants BID primary key (bookno);ALERT TABLE table_name MODIFY( column1 PRIMARY KEY);3、创建Unique约束:ALTER TABLE students ADD CONSTRAINT uk_students_license UNIQUE (state, license_no)USING INDEX TABLESPACE student_index;4、创建Check约束:定义每⼀记录都要满⾜的条件,条件表达式不允许有:CURRVAL, NEXTVAL, LEVEL, ROWNUM,SYSDATE, UID, USER, USERENV 函数:ALTER TABLE students ADD CONSTRAINT ck_students_st_lic CHECK ((state IS NULL AND license_no IS NULL) OR (state IS NOT NULL AND license_no is NOT NULL));添加check约束(check_1为约束名,dept_salary为字段名 ) alter table emp add constraint check_1 check(dept_salary>0); 5、创建外键约束:ALTER TABLE students ADD CONSTRAINT fk_students_state FOREIGN KEY (state) REFERENCES state_lookup (state);6. 创建不能为空约束 not nullalter table table_name modify(name not null);alter table table_name modify name1 varchar2(20) not null;实例1:⾸先创建学⽣信息表studentinfo和学⽣成绩表testinfo。
sqlserver中sql修改表的字段名、字段属性等向sql server表中增加一个 varchar 列:ALTER TABLE distributors ADD COLUMN address varchar(30);从sql server表中删除一个字段:ALTER TABLE distributors DROP COLUMN address RESTRICT;在一个操作中修改两个现有字段的类型:ALTER TABLE distributorsALTER COLUMN address TYPE varchar(80),ALTER COLUMN name TYPE varchar(100);使用一个 USING 子句,把一个包含 UNIX 时间戳的 integer 字段转化成 timestamp with time zone:ALTER TABLE fooALTER COLUMN foo_timestamp TYPE timestamp with time zoneUSINGtimestamp with time zone 'epoch' + foo_timestamp * interval '1 second';对现存字段改名:ALTER TABLE distributors RENAME COLUMN address TO city;更改现存sql server表的名字:ALTER TABLE distributors RENAME TO suppliers;给一个字段增加一个非空约束:ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;从一个字段里删除一个非空约束:ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;给一个表增加一个检查约束:ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK(char_length(zipcode) = 5);删除一个表和它的所有子表的监查约束:ALTER TABLE distributors DROP CONSTRAINT zipchk;向表中增加一个外键约束:ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses(address) MATCH FULL;给表增加一个(多字段)唯一约束:ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);给一个表增加一个自动命名的主键约束,要注意的是一个表只能有一个主键:ALTER TABLE distributors ADD PRIMARY KEY (dist_id);把表移动到另外一个表空间:ALTER TABLE distributors SET TABLESPACE fasttablespace;。
sqlserver常⽤sql语句,更改字段,建⽴唯⼀键,多个字段去重复等--修改字段类型:--alter table 表名 alter column 待修改字段名待修改字段类型alter table users alter column userid varchar(10)--多个字段建⽴唯⼀索引create unique index [索引名] on 表名(字段名,字段名)alter table 表名 add constraint 约束名 unique (字段名)alter table 表名 add constraint 约束名 unique (字段名,字段名)--创建表的时候创建⾃增主键create table tb(id int identity(1,1) primary key )--修改字段主键⾃增进⼊ssms界⾯设置alter table tb alter column id int not nullalter table tb add constraint pkid primary key (id)--修改字段为⾮空alter table tb alter column id int not null--建⽴索引create index mycolumn_index on mytable (myclumn)--AmazonOrderId和seller_id两个字段重复SELECT count(*)FROM (SELECT rn = ROW_NUMBER()OVER(PARTITION BY AmazonOrderId, seller_id ORDER BY GETDATE()), *FROM Orders) tWHERE rn = 1。
SQL Server2005中的约束约束(constraint):约束是SQL Server提供的自动保持数据库完整性的一种方法,它通过限制字段中数据、记录中数据和表之间的数据来保证数据的完整性。
在SQL SERVER中,对于基本表的约束分为列约束和表约束。
(要想看列约束和表约束的区别,请看检查约束的例子。
)列约束是对某一个特定列的约束,包含在列定义中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名;表约束与列定义相互独立,不包括在列定义中,通常用于对多个列一起进行约束,与列定义用’,’分隔,定义表约束时必须指出要约束的那些列的名称。
1)创建约束完整性约束的基本语法格式为:[CONSTRAINT constraint_name(约束名)]<约束类型>约束不指定名称时,系统会给定一个名称。
在SQL Server2005中有6种约束:主键约束(primary key constraint)、惟一性约束(unique constraint)、检查约束(check constraint)、默认约束(default constraint)、外部键约束(foreign key constraint)空值(NULL)约束。
创建检查约束常用的操作方法有如下两种:使用SQL Server管理平台创建检查约束(即右键,选择,点击的过程);用Transact-SQL语句创建检查约束。
2)检查约束CHECK检查约束对输入列或者整个表中的值设置检查条件,以限制输入值,保证数据库数据的完整性。
这里全选sql语句写的约束做例子。
用Transact-SQL语句创建检查约束。
其语法形式如下:CONSTRAINT constraint_nameCHECK[NOT FOR REPLICATION](logical_expression)例(注:下面为列约束)CREATE TABLE我的会员(会员编号smallint NOT NULL CONSTRAINT MemberNoChkCHECK(会员编号BETWEEN1AND10000),姓名nvarchar(20)NOT NULL,地址nvarchar(60)NOT NULL);GO(注:下面为表约束)看清楚了没有:列约束和表约束的区别就是列约束是直接跟在后面,而表约束则不是。
SQLServer中有关约束(constraint)的⼀些细节本⽂出处:(保留出处并⾮什么原创作品权利,本⼈拙作还远远达不到,仅仅是为了链接到原⽂,因为后续对可能存在的⼀些错误进⾏修正或补充,⽆他)SQL Server 数据库中的约束(Constrint)是作⽤是为了保证数据库的完整性和⼀致性,可以建表的时候指定某个字段要符合某种约束(或者对已有表的字段添加约束),⽐如唯⼀性(或者主键)约束,⾮空约束,默认值约束等对于具体的约束,可以分为主键(唯⼀键)约束,默认值约束,检查约束,外键约束等⼏类。
约束的创建⽅式 1,建表的时候指定 如下,可以在建表的时候指定某些字段满⾜某种约束。
2,以创建约束的⽅式指定 也即在建表的时候没有指定任何约束,在建表之后,以alter table的⽅式指定某些字段上的约束 对于Check或者Default约束,也可以事先定义出来规则(Rule),然后将规则绑定到对应表的字段 如下分别定义了⼀个check约束和默认值约束,然后将表的字段绑定到对应的约束,这样做的好处是对于某些复杂的约束,定义好约束之后就可以重⽤了 需要注意的是,对于Rule来说,NULL值是不与任何规则冲突的, 举个例⼦,如下,虽然把TestConstrint.Sex字段指定了规则Rule_Sex,如果Sex定义的是int,该字段写⼊数据的时候只能是0或者1,写⼊2是失败的, 但是往该字段写⼊null值是可以的,因为null与规则指定的(0,1)相⽐没有任何意义(或者没有任何结果)约束的⼀些特点 对于建表的时候指定的未命名的约束,SQL Server会⾃动⽣成后缀随机的默认的约束名字,为了增加规范性,正常情况下是不允许这么写的,因为我们不希望看到数据库中⼀堆乱七⼋脏的命名。
如果是指定约束的名字,看起来就规范多了。
如果是通过定义规则,然后绑定到表的字段的情况下,通过SSMS的图形界⾯,是看不到约束展开之后的内容的(虽然这个约束是⽣效的)数据库约束中那些不容易被注意的坑 约束看起来⾮常简单,不管是在建表的时候直接指定,或者是通过alter 表的⽅式增加约束,看起来都没有任何问题,条条⼤道通罗马,不过⾥⾯还是有⼀些⼩坑的。
SqlServer索引、优化、约束、连接1. 索引的创建和删除2. create index in_name on person(name) --创建索引drop index person.in_name --删除索引create index in_name_age on person(name,age) --创建两个字段索引索引分为聚集索引和⾮聚集索引,1. 索引与表物理顺序⼀致,就是聚集索引,聚集索引只能有⼀个2. 索引与表物理地址不⼀致,就是⾮聚集索引,⾮聚集索引可以有多个3. 优化机巧:1. 对常⽤字段创建索引2. where⼦句尽量写在后⾯,如果有⼦查询先写⼦查询3. 使⽤参数化查询⽅式进⾏编程4. 需要查⼏个字段就写⼏个字段,不要全部⽤*5. 尽量少些sql,能简单实现的不要过多sql才实现6. 表连接效率⾼于exists和in关键字使⽤7. ⼀旦索引字段进⾏了计算,则会全表扫描,影响效率8. union all 效率⽐union⾼4. ⾮空约束: NOT NULL5. 单字段唯⼀约束:6. create table studentInfo(id int identity(1,1),name varchar(20) unique)insert into studentInfo values('kit')insert into studentInfo values('kit') --插⼊第⼆条时报错,提⽰定义唯⼀约束,不能插⼊重复多字段复合约束7. create table TeacherInfo(id int identity(1,1),Fnum int,FDep int,constraint FND unique(fnum,fdep)) -- FND为复合约束名表已存在,新增约束8. alter table studentinfo add constraint s1 unique(name)删除约束9. alter table teacherinfo drop constraint FND --删除复合约束检查约束check10. alter table Person add check(age >2) --新增检查约束标识年龄必须⼤于2主键约束,主键后跟 primary key11. alter table studentinfo add constraint py primary key(id) --新增主键约束alter table studentinfo drop constraint py --删除约束外键约束12. create table Person(ID int identity(1,1),Name varchar(20),Age int,DepID nvarchar(20),primary key(id),foreign key(DepID) references DepMent(id))表连接13. --表连接select*from Personselect*from Depment--内连接,默认只写⼀个join就是内连接select ,Depment.depname from Personinner join Depmenton Depment.id = Person.DepIDwhere DepID ='001'--交叉连接:涉及到的表的所有记录都显⽰出来select ,d.depname from Person pcross join Depment d--外部连接--左外连接:不管是否匹配成功,都会返回左边全部记录select ,d.depname from Person pleft outer join Depment don p.depid = d.id--右外连接:返回右表全部数据,和左表匹配数据select ,d.depname from Person pright outer join Depment don d.id = p.DepID--全部外连接select ,d.depname from Person pfull outer join Depment don d.id = p.DepID。
外键约束的测试表与测试数据-- 创建测试主表. ID 是主键.CREATE TABLE test_main (id INT,value V ARCHAR(10),PRIMARY KEY(id));-- 创建测试子表.CREATE TABLE test_sub (id INT,main_id INT,value V ARCHAR(10),PRIMARY KEY(id));-- 插入测试主表数据.INSERT INTO test_main(id, value) V ALUES (1, 'ONE');INSERT INTO test_main(id, value) V ALUES (2, 'TWO');-- 插入测试子表数据.INSERT INTO test_sub(id, main_id, value) V ALUES (1, 1, 'ONEONE'); INSERT INTO test_sub(id, main_id, value) V ALUES (2, 2, 'TWOTWO'); 默认外键约束方式1> ALTER TABLE test_sub ADD CONSTRAINT main_id_cons FOREIGN KEY (main_id) REFERENCES test_main;2> go1> DELETE2> test_main3> WHERE4> ID = 1;5> go消息547,级别16,状态1,服务器HOME-BED592453C\SQLEXPRESS,第1 行DELETE 语句与REFERENCE 约束"main_id_cons"冲突。
该冲突发生于数据库"Stock",表"dbo.test_sub", column 'main_id'。
SQLServer外键关系是强制约束,外键值也可以是空(NULL)在SQL Server中,实际上外键值可不可以为空(NULL),和外键关系是不是强制约束⽆关。
我们先在SQL Server数据库中建⽴两张表People和Car,⼀个People可以有多个Car,所以这两张表是⼀对多关系。
建⽴表People建表语句:CREATE TABLE[dbo].[People]([ID][int]NOT NULL,[Name][nvarchar](50) NULL,[Age][int]NULL,[Sex][nvarchar](50) NULL,CONSTRAINT[PK_People]PRIMARY KEY CLUSTERED([ID]ASC)WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON[PRIMARY] ) ON[PRIMARY]GO其中列ID是People表的主键Car建表语句:CREATE TABLE[dbo].[Car]([ID][int]NOT NULL,[Brand][nvarchar](50) NULL,[PeopleID][int]NULL,CONSTRAINT[PK_Car]PRIMARY KEY CLUSTERED([ID]ASC)WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON[PRIMARY] ) ON[PRIMARY]GOALTER TABLE[dbo].[Car]WITH CHECK ADD CONSTRAINT[FK_Car_People]FOREIGN KEY([PeopleID])REFERENCES[dbo].[People] ([ID])GOALTER TABLE[dbo].[Car]CHECK CONSTRAINT[FK_Car_People]GO其中列ID是Car表的主键,此外列PeopleID是Car表的外键,其关联People表的主键ID。
SQL PRIMARY KEY 约束PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含NULL 值。
每个表应该都一个主键,并且每个表只能有一个主键。
SQL Server :CREATE TABLE Persons(Id_P int NOT NULL PRIMARY KEY,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255))如果需要命名PRIMARY KEY 约束,以及为多个列定义PRIMARY KEY 约束,请使用下面的SQL 语法:CREATE TABLE Persons(Id_P int NOT NULL,LastName varchar(255) NOT NULL,FirstName varchar(255),Address varchar(255),City varchar(255),CONSTRAINT uc_PersonID PRIMARY KEY (Id_P,LastName))SQL PRIMARY KEY Constraint on ALTER TABLE如果在表已存在的情况下为"Id_P" 列创建PRIMARY KEY 约束,请使用下面的SQL:MySQL / SQL Server / Oracle / MS Access:ALTER TABLE PersonsADD PRIMARY KEY (Id_P)如果需要命名PRIMARY KEY 约束,以及为多个列定义PRIMARY KEY 约束,请使用下面的SQL 语法:MySQL / SQL Server / Oracle / MS Access:ALTER TABLE PersonsADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)注释:如果您使用ALTER TABLE 语句添加主键,必须把主键列声明为不包含NULL 值(在表首次创建时)。
SQLServer之修改UNIQUE约束使⽤SSMS数据库管理⼯具修改UNIQUE约束1、连接数据库,选择数据表-》右键点击-》选择设计(或者展开键,选择要修改的键,右键点击,选择修改,后⾯步骤相同)。
2、选择要修改的数据列-》右键点击-》选择索引/键。
3、在索引/键弹出框中-》选择要修改的唯⼀约束-》选择约束类型-》点击列。
4、在索引列弹出框中-》选择要约束的数据列-》选择要约束的数据列的排序规则-》点击确定。
5、在索引/键弹出框中-》输⼊要修改的唯⼀约束名称-》输⼊要修改的唯⼀约束描述-》表设计器规则可以使⽤系统默认-》点击关闭。
6、点击保存(或者ctrl+s)-》刷新表-》查看修改结果。
使⽤T-SQL脚本修改UNIQUE约束若要使⽤ Transact-SQL 修改 UNIQUE 约束,必须⾸先删除现有的 UNIQUE 约束,然后⽤新定义重新创建。
语法:--修改唯⼀约束--声明数据库引⽤use 数据库名;go--判断是否唯⼀约束是否存在,如果存在则删除,不存在则添加if exists(select * from sysobjects where name=约束名)alter table 表名 drop constraint 约束名;go--添加唯⼀约束alter table 表名add constraint 约束名unique[nonclustered|clustered] --在“表设计器”下的⽹格中,选择“创建为群集索引”,再从下拉列表中选择“是”创建群集索引,或选择“否”创建⾮群集索引。
对于每个表,只允许存在⼀个聚集索引。
如果此表中已经存在聚集索引,则您必须⾸先对原始索引清除此设置。
(列名 [asc|desc])--fillfactor:填充因⼦适⽤于底层,指定⼀个百分⽐,指⽰数据库引擎在索引创建或更改期间应该使每个索引页的叶级别有多满。
指定的值必须是1到100之间的整数值。
默认值为0。
按照规则重命名所有外键名称以前⽤PD设计数据库时,或者直接在企业管理器设计表结构时,总想将外键⼿⼯按规则命名,⽽不是使⽤系统⾃动产⽣的随机名称。
但是⼿⼯命名⼀段时间后,就觉得太累,啰嗦,很烦,慢慢的就不了了之了。
不过,平⼼⽽论我们还是希望所有对象的命名是规范的,这样做不但看着舒服、显得好看专业,⽽且在着急调整某个外键时可以根据规则直接写出其名称,不需要先去查看到底其名称是什么。
今天痛下决⼼,写了个sql,按规则重命名所有外键信息。
呵呵,挺好,能够懒点的话,还是懒点好!CREATE PROC proc_Rename_FkeysAS/*************************************************************************创建时间:2010-01-21 10:31创建⼈员:王召冠功能说明:按照规则重命名所有外键名称。
命名规则:fk__FkTableName__FkColumnName__PkTableName__PkColumnName注意事项:业务注释:--------------------------------------------------------------------------修改时间:2010-01-21 13:42修改⼈员:王召冠修改说明:增加对多字段主外键关联情况的⽀持**************************************************************************/DECLARE@vTableName NVARCHAR(50), --⽤户表名称@vPkTableName NVARCHAR(50), --主键表名称@vPkColumnName NVARCHAR(50), --主键字段名称@vFkTableName NVARCHAR(50), --外键表名称@vFkColumnName NVARCHAR(50), --外键字段名称@vFkName NVARCHAR(500), --原外键名称@vFkNewName NVARCHAR(500) --按照规则产⽣的新外键名称-- 循环所有⽤户表DECLARE table_cursor CURSOR FORSELECT NAMEFROM sysobjectsWHERE TYPE ='U'OPEN table_cursorFETCH NEXT FROM table_cursor INTO@vTableNameWHILE@@FETCH_STATUS=0BEGIN-- 定义暂存关联表,⽤来存储当前表的所有关联外键信息(当前表为主键表)CREATE table #fkeysout(OID INT IDENTITY,PKTABLE_QUALIFIER sysname collate database_default NULL,PKTABLE_OWNER sysname collate database_default NULL,PKTABLE_NAME sysname collate database_default NOT NULL,PKCOLUMN_NAME sysname collate database_default NOT NULL,FKTABLE_QUALIFIER sysname collate database_default NULL,FKTABLE_OWNER sysname collate database_default NULL,FKTABLE_NAME sysname collate database_default NOT NULL,FKCOLUMN_NAME sysname collate database_default NOT NULL,KEY_SEQ smallint NOT NULL,UPDATE_RULE smallint NULL,DELETE_RULE smallint NULL,FK_NAME sysname collate database_default NULL,PK_NAME sysname collate database_default NULL,DEFERRABILITY smallint NULL)-- 取得当前表的关联外键信息INSERT INTO #fkeysout (PKTABLE_QUALIFIER,PKTABLE_OWNER,PKTABLE_NAME,PKCOLUMN_NAME,FKTABLE_QUALIFIER,FKTABLE_OWNER,FKTABLE_NAME,FKCOLUMN_NAME,KEY_SEQ,UPDATE_RULE,DELETE_RULE,FK_NAME,PK_NAME,DEFERRABILITY)EXEC sp_fkeys @vTableName-- 取得正确的,应该修改的外键信息,暂存(因为存在相同的外键,却创建了两个外键约束)SELECT MIN(OID) AS OIDINTO #tmp1FROM #fkeysoutGROUP BY PKTABLE_NAME, PKCOLUMN_NAME, FKTABLE_NAME, FKCOLUMN_NAME, KEY_SEQ-- 取得重复的外键信息SELECT FKTABLE_NAME, FK_NAME, OIDINTO #tmp2FROM #fkeysoutWHERE OID NOT IN (SELECT OID FROM #tmp1)/*----------------重命名外键信息-------------------*/DECLARE fkRename_cursor CURSOR FORSELECT PKTABLE_NAME, FKTABLE_NAME, FK_NAMEFROM #fkeysoutWHERE OID IN (SELECT OID FROM #tmp1)GROUP BY PKTABLE_NAME, FKTABLE_NAME, FK_NAMEOPEN fkRename_cursorFETCH NEXT FROM fkRename_cursorINTO@vPkTableName, @vFkTableName, @vFkNameWHILE@@FETCH_STATUS=0BEGIN-- 处理多个字段为主外键的情况SET@vFkColumnName=''SET@vPkColumnName=''SELECT@vFkColumnName=@vFkColumnName+'__'+ FKCOLUMN_NAME,@vPkColumnName=@vPkColumnName+'__'+ PKCOLUMN_NAMEFROM #fkeysoutWHERE FK_NAME =@vFkNameORDER BY KEY_SEQSET@vFkNewName='fk__'+@vFkTableName+@vFkColumnName+'__'+@vPkTableName+@vPkColumnName EXEC sp_rename @vFkName, @vFkNewNameFETCH NEXT FROM fkRename_cursorINTO@vPkTableName, @vFkTableName, @vFkNameENDCLOSE fkRename_cursorDEALLOCATE fkRename_cursor/*--------------------重命名完成--------------------*//*----重复的外键定义需要删除(即,除了外键名称外其余信息完全相同)----*/DECLARE fkFault_cursor CURSOR FORSELECT FKTABLE_NAME, FK_NAMEFROM #tmp2OPEN fkFault_cursorFETCH NEXT FROM fkFault_cursorINTO@vFkTableName, @vFkNameWHILE@@FETCH_STATUS=0BEGIN--ALTER TABLE RM_tToolApply DROP CONSTRAINTEXEC('ALTER TABLE '+@vFkTableName+' DROP CONSTRAINT '+@vFkName) FETCH NEXT FROM fkFault_cursorINTO@vFkTableName, @vFkNameENDCLOSE fkFault_cursorDEALLOCATE fkFault_cursor/*--------------- 删除重复的外键结束 -------------------------*/DROP TABLE #tmp1DROP TABLE #tmp2DROP TABLE #fkeysout-- 操作下⼀个⽤户表的外键信息FETCH NEXT FROM table_cursor INTO@vTableNameENDCLOSE table_cursorDEALLOCATE table_cursor。
Sql Server重命名所有外键约束
公司服务器上的数据库原先是采用PowerDesigner设计的,那些外键约束的命名非常难看,并且也和后来在SSMS中额外添加的外键约束命名规则不一致,因此我想遍历数据库的所有外键约束,找到外键约束的相关对象,然后重新生成一致的命名。
我采用的命名规则是:
FK_ForeignTable_PrimaryTable_On_ForeignColumn
直白的翻译就是,ForeignTable在ForeignColumn列上引用了PrimaryTable的主键。
Sql Server提供了很多动态管理视图(Dynamic management views,DMV)和存储过程,方便我们对数据库进行维护。
这里我用到了以下两个
sys.foreign_key_columns(包含外键约束完整信息)和sys.objects(数据库对象信息)这两个DMV以及sp_rename执行重命名的系统存储过程。
代码如下:
declare fkcur cursor for
select
OBJECT_NAME(col.constraint_object_id) as FKConstraintName
, as FKTable
, as FKColumn
, as PKTable
, as PKColumn
from sys.foreign_key_columns col
-- 外键约束是建立在外键表上的,
-- 因此foreign_key_columns表中的parent_object_id和parent_column_id 分别表示外键表和外键列
inner join sys.objects fkTable
on fkTable.object_id = col.parent_object_id
inner join sys.columns fkCol
on fkCol.column_id = col.parent_column_id
and fkCol.object_id = fkTable.object_id
-- foreign_key_columns表中的referenced_object_id和
referenced_column_id分别指向
-- 外键约束的主键表对象以及主键列
inner join sys.objects pkTable
on pkTable.object_id = col.referenced_object_id
inner join sys.columns pkCol
on pkCol.column_id = col.referenced_column_id
and pkCol.object_id = pkTable.object_id
order by OBJECT_NAME(col.constraint_object_id)
open fkcur
declare @constraintName nvarchar(128)
declare @fkTable nvarchar(64)
declare @fkColumn nvarchar(64)
declare @pkTable nvarchar(64)
declare @pkColumn nvarchar(64)
declare @newConstraintName nvarchar(128)
fetch next from fkcur
into @constraintName,@fkTable,@fkColumn,@pkTable,@pkColumn
while @@FETCH_STATUS = 0
begin
set @newConstraintName = 'FK_'+@fkTable+'_'+@pkTable+'_On_'+@fkColumn exec sp_rename @constraintName,@newConstraintName,'Object'
fetch next from fkcur
into @constraintName,@fkTable,@fkColumn,@pkTable,@pkColumn
end
close fkcur
deallocate fkcur。