导读:在看《SQL必知必会(第四版)》看到运用外键建立表关系,联想到工作时建表主键类型的选择问题,查资料的时候遇到了比较简洁的一个文章;

1. 基础理论:

1.主键和外键的设计原则。
a. 主键应尽量分离于业务的。
b. 主键应尽量是单列的,以便提高筛选和连接的效率。
c. 主键不应该被更新,且不含动态变化的数据。
d. 主键应是有计算机自动生成的。

2.常见的主键选取方式
a.自动增长。
b.手动增长字段
c.UniqueIdentifier
d.COMB Combine 组合类型
目前再项目中用到了a,c两种。以下是优缺点
使用自增长做主键的优点:
1、很小的数据存储空间
2、性能最好
3、容易记忆
使用自增长做主键的缺点:
1、如果存在大量的数据,可能会超出自增长的取值范围
2、很难(并不是不能)处理分布式存储的数据表,尤其是需要合并表的情况下
3、安全性低,因为是有规律的,容易被非法获取数据
使用GUID做主键的优点:
1、它是独一无二的,出现重复的机会少
2、适合大量数据中的插入和更新操作,尤其是在高并发和分布式环境下
3、跨服务器数据合并非常方便
4、安全性较高
使用GUID做主键的缺点:
1、存储空间大(16 byte),因此它将会占用更多的磁盘空间
2、会降低性能
3、很难记忆

COMB Combine 组合类型的方法:uuid+时间

ID=CAST(CAST(NEWID() AS BINARY(10))   + CAST(GETDATE() AS BINARY(6)) AS UNIQUEIDENTIFIER)

2. SQL 中的约束
2.1 Not Null
作用:强制字段始终包含值,若字段为null,无法插入或更新记录。

/-- 创建表时添加 not  null 约束
create table table_NotNull
(ID int identity(1,1) primary key,Name varchar(50) not null
)
/--对已经存在是某列添加not null 约束
/--已存在的数据中 Name均有值
alter table dbo.table_NotNull alter column Name varchar(20) not null
/--已存在的数据中 存在Name为null 的情况。以后无法插入name=null 的数据
alter table dbo.table_NotNull with nocheck add constraint Name check(Name is not null)

2.2 unique
作用:约束唯一标识数据库-表中的每条数据。

create table table_Unique
(ID int primary key Identity(1,1) not null,Name varchar(50) unique,Age int not null
)
alter table table_Unique add unique(Age)

2.3 primary key
作用:主键,记录唯一标识,主键自动拥有not null及 unique约束。

/--定义多个列的primaey key 约束
create Table Table_PrimaryKey
(Code varchar(20),//自动约束为not nullDateInfo datetime,//自动约束为not nullName varchar(20) not null,constraint pk_Table_PrimaryKey Primary Key(Code,DateInfo)
)
-- 主键列应申明不包含null 值
ALTER TABLE Table_PrimaryKey ADD PRIMARY KEY (Code )
ALTER TABLE Table_PrimaryKey ADD CONSTRAINT pk_PersonID PRIMARY KEY (Code,DateInfo)

2.4 foreign key
作用:外键,预防破坏表之间的连接行为,防止非法数据插入外键列。

create Table Table_ForeignKey
(Id int identity(1,2) primary key,Code int,DateInfo datetime,constraint fk_ForeignKey foreign key(Code) references table_Unique(ID)
)
--撤销外键约束 定义外键且已命名
ALTER TABLE [dbo].[Table_ForeignKey] drop constraint fk_ForeignKey

2.5 Check
作用:限制列的取值范围

create Table Table_Check
(Id int identity(1,2) primary key,Age int not null,State int,constraint ck_Check check(Age>20 and State in (0,1))
)
--删除同上

2.6 DEFAULT
作用:设置默认值

create Table Table_DEFAULT
(Id int identity(1,2) primary key,Age int not null,State int,Name varchar(20) DEFAULT 'Sandnes'
)
--更改
ALTER TABLE Table_DEFAULT ALTER COLUMN City
SET DEFAULT 'ss' (drop DEFAULT )

参考:1. 优缺点 http://www.yyjjssnn.cn/articles/754.html
2. 4中常见方法 http://blog.sina.com.cn/s/blog_5f39af320102wsfs.html
3.sql 基础:http://www.runoob.com/sql/sql-default.html

数据库主键 4种类型及6种约束相关推荐

  1. (转)关于数据库主键和外键(终于弄懂啦)

    一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键  比如   学生表(学号,姓名,性别,班级)  其中每个学 ...

  2. 小议数据库主键选取策略

    我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一 行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引.因为主键可以唯一标识某一行记录,所以可以确保执行数据更 ...

  3. 关于数据库主键和外键

    一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键  比如   学生表(学号,姓名,性别,班级)  其中每个学 ...

  4. 小议数据库主键选取策略(转自吕震宇老师博文)

    < DOCTYPE html PUBLIC -WCDTD XHTML TransitionalEN httpwwwworgTRxhtmlDTDxhtml-transitionaldtd> ...

  5. 小议数据库主键选取策略(转)

    我们在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引.因为主键可以唯一标识某一行记录,所以可以确保执行数据更新 ...

  6. 数据库主键到底是用自增长(INT)好还是UUID好?

    数据库主键到底是用自增长(INT)好还是UUID好? 使用自增长做主键的优点: 1.很小的数据存储空间 2.性能最好 3.容易记忆 使用自增长做主键的缺点: 1.如果存在大量的数据,可能会超出自增长的 ...

  7. Oracle数据库主键自增

    Oracle数据库主键自增 在学习mysql时,我们很容易通过auto_increment就能实现主键自增的功能,但是在Oracle数据库中,是没有这个关键字的,所以也不能通过这样来实现主键自增.下面 ...

  8. 关于数据库主键和外键,索引

    一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号 ...

  9. mysql数据库主键如何设计

    聊一个实际问题,淘宝的数据库的主键是如何设计的呢? 某些错误的离谱的答案还在网上流传着.其中一个明显的错误就是关于mysql的主键设计. 大部分人的回答如此自信就是:用8个自己的bigint做主键,而 ...

  10. MySql数据库主键外键与数据库设计

    MySql数据库主键外键与数据库设计 首先要指出的: 列.字段.属性是一个概念 行.记录.元组是一个概念 MySQL数据库CONSTRAINT约束:非空约束,唯一约束,主键约束,外键约束 show c ...

最新文章

  1. linux安装中文环境,[Linux]Ubuntu 7.04 中文环境的安装
  2. 【跃迁之路】【530天】刻意练习系列289(2018.07.20)
  3. Android5.0之CardView的使用
  4. Failed to install*.apk on device '': timeout
  5. VirtualAPK:滴滴 Android 插件化的实践之路
  6. java中文 x_java环境url中文参数乱码处理
  7. 《Android开发艺术探索》读书笔记 (10) 第10章 Android的消息机制
  8. [转载] python价值算法_PangRank算法原理及其Python实现
  9. 五大傻瓜式移动应用开发工具
  10. CTO(技术总监)平时都在做些什么?
  11. python利用中误差检验影像精度
  12. java解析宏文件,从命令行或批处理文件运行Excel宏的方法?
  13. 资产负债表与利润表钩稽关系
  14. js循环绑定事件问题及解决方法
  15. 在springboot中加入Hystrix
  16. 如何设置迪文T5L串口屏的防盗版功能?
  17. YTU.3241: 奇怪的比赛
  18. python如何拟合函数_我们如何在Python中拟合一个sigmoid函数?(How do we fit a sigmoid function in Python?)...
  19. 【数字IC验证快速入门】1、浅谈数字IC验证,了解专栏内容,明确学习目标
  20. 慕课软件质量保证与测试(第三章.单元测试)

热门文章

  1. 巧用Windows Media Player翻录功能,把光盘上cd曲目复制到电脑。
  2. 基于51单片机列车车门自动开关测试台开发
  3. 在EXCEL表格中如何进行排序(如按照成绩总分排名)
  4. error:2006D080:BIO routines:BIO_new_file:no such file
  5. 视频码率,帧率和分辨率的联系与区别
  6. [UE4] 使用 GUI 框架“Dear ImGui”
  7. 从苏宁电器到卡巴斯基第37篇:我与卡巴斯基的邂逅(中)
  8. c语言指针数组 难点总结,C语言指针与数组的难点分析.pdf
  9. 人工智能数学基础-函数对称
  10. ccf--20150303--节日