首页 > 数据库 >SQL主键和约束

SQL主键和约束

时间:2023-07-03 10:22:54浏览次数:64  
标签:constraint 外键 约束 key SQL table 主键

SQL主键和约束

原创 Lyle_Tu Linux分布式主任 2023-06-17 17:08 发表于福建 收录于合集 #sql5个 #数据库7个 #linux36个 #服务器18个

 

主键

1.工具创建表  列  数据类型  是否null 

     一个表中,会存很多条记录,需要一个列来唯一标识一条数据。

     主键:唯一标识一条数据。值 不能重复   不能为空

     什么样的列可以设置为主键:值 不能重复   不能为空

     什么叫标识列?一个列设置成标识列,它就不能再手动插入,插入时,自动生成的。

             这个列,类型必须是不带小数的数值型  整型

        标识列:标识种子 第一条记录标识列的值 100   增量  3

                    删除了数据,再插入,就会出现不连续   缺点

 

主键的特点【重点】

含有主键的表叫做主键表

主键通常都是整数不建议使用字符串当主键(如果主键是用于集群式服务,才可以考虑用字符串当主键)

主键的值通常都不允许修改,除非本记录被删除

主键不要定义成id,而要定义成表名Id或者表名_id

                    要用代理主键,不要用业务主键

                    任何一张表,强烈建议不要使用有业务含义的字段充当主键

                    我们通常都是在表中单独添加一个整型的编号充当主键字段

主键是否连续增长不是十分重要

 

2.创建主键   联合主键 唯一标识

创建一个主键,同时自动创建了一个聚集索引

3.创建外键

     外键:一般在两个表之间要建立关联时候,创建

           一个列创建为外键,它在另一个表必须是主键

     外键:DeptId  UserInfos 外键表

         

          DeptInfos 主键表

    两个表一旦建立外键关系,外键表里的对应的外键列,它的值必须是它对应的主键表里的主键值,不如果你想插入一个不存在 的值,你是插入不进去的。

    一个表里可以有多个外键,也可以没有,一个表只能有一个主键,也可以没主键,但一般都会设置一个主键。

 

问题:先删主键表还是外键表?

答:先删外键表。如果先删主键表,会报错,因为这会导致外键表中的数据引用失败。

 

约束

  1. 约束定义:规定表中的数据规则。如果存在违反约束的数据行为,行为就会被阻止。

     

  在什么时候可以创建约束呢?使用软件创建,创建表之后,  使用脚本创建表:可以在创建的过程中,也可以在创建后再来建立约束。

2. 分类

主键  Primary Key约束:唯一性、非空,不能修改。

  • defaut:为默认值约束的关键字,用于指定其后的default_expression 为默认值表达式  。                                                                        

  • identity:[(seed,increment)] 表示该列为标识列或称自动编号列。

  • constraint       constraint_name 为可选项,关键字constraint用于指定其后面的约束名称constraint_name。如省略本选项,则系统自动会给出一个约束名。建议选择约束名以便于识别。

  • primary key:表示该列具有主键约束。

  • clustered | nonclustered 表示建立聚簇索引和非聚簇索引,省略此选项默认为聚簇选项。

 

     外键  Foreign Key约束:加强两个表的一列或多列数据之间的连接的。先建立主表的主键,然后再定义从表中的外键。只有主表中的主键才能被从表用来作为外键使用。主表限制了从表更新和插入的操作。当删除主表中的某条数据,应该是先删除从表中相关的数据,再删除主表。

   创建外键约束格式:

    Unique约束 唯一性约束:确保表中的一列数据没有相同的值。与主键约束相似,但又不同。主键只能有一个,但一个表中可以定义多个唯一约束。唯一键可以为NULL,但主键不可以。

    Check约束:通过逻辑表达式来判断数据的有效性,用来限制输入一列或多列的值的范围。

    Default约束:默认值约束。用户在插入新的数据行时,如果该行没有指定数据,那么系统将默认值赋给该列,如果没有设置默认值,系统就会默认为NULL。

    Not Null : 非空性约束 

3、表和约束的异同

  •  数据库是通过表来解决事物的存储问题的

  •  数据库是通过约束来解决事物取值的有效性和合法性的问题

  •  建表的过程就是指定事物属性及其事物属性各种约束的过程

 

4、primary key 约束与unique 约束的主要区别:

  • 一个数据表只能创建一个primary key 约束,但一个表中可根据需要对不同的列创建若干个unique 约束。

  • primary key 字段的值不允许为NULL,而unique字段的值可取NULL.

  • 一般创建primary key约束时,系统会自动产生索引,索引的默认类型为聚簇索引。创建unique 约束时,系统会自动产生一个unique索引,索引的默认类型为非聚簇索引。

     

相同点:

  • 二者均不允许表中对应字段存在重复值。

  • 二者均自动创建一个唯一索引

 

语法格式

1.在创建表的过程中创建约束

   unique    主键约束   外键约束   unique约束(唯一约束)  check约束   default约束 default('')    primary key   foreign key references 主表名(主键列名)

 

2.在创建表完成后再创建约束

  alter table 表名 add constraint 约束名      primary key (列名) /      foreign key(列名) references 主表(列名)/      unique (列名)/      check(逻辑表达式)      default(缺省值) for 列名

     

3、设置主键约束

 语法:

CONSTRAINT  constraint_name  PRIMARY  KEY  ( column_name )

 

例子:

create table mysc(sno char(4) not null, cno char(10) not null, grade tinyint)alter table myscadd constraint mysc_pkprimary key (sno,cno)alter table myscdrop constraint mysc_pk

 

4. 设置唯一性约束

  语法:

CONSTRAINT  constraint_name UNIQUE ( column_name )

           

例子:

create table 雇员表(雇员号 char(10) primary key, 雇员名 nvarchar(8) unique )alter table studentadd constraint uk_sname_sunique (sname)select * from studentwith (index=uk_sname_s)alter table studentdrop constraint uk_sname_s

 

5. 外键约束

语法:

CONSTRAINT  constraint_name  FOREIGN  KEY(column_name[,…n])REFERENCES    ref_table  [(ref_column[,…n])]

 

例子:

create table xs(sno char(10) primary key)create table xs_kc(sno char(10), cno char(4), grade tinyint, foreign key (sno) references xs(sno)        on update cascade        on delete cascade)create table kc(cno char(4) primary key, cname nvarchar(20), cpno char(4), credit tinyint)alter table xs_kc        add constraint kc_foreign                foreign key (cno) references kc(cno)alter table xs_kcdrop constraint  kc_foreign

 

6. Check 约束:

例子:

alter table xsadd ssex char(2)        constraint sex_ck                check(ssex in ('男','女'))alter table xs_kcdrop constraint sex_ckalter table xs_kcadd constraint grade_ck        check(grade>=0 and grade<=750)alter table xs_kcdrop constraint grade_ck

 

7. 默认约束default

格式:

CONSTRAINT constraint_name DEFAULT  constraint_expression  [FOR column_name]

 

例子:

create table mystudent2(sno char(10), sname nvarchar(4), ssex char(2), sdept nvarchar(10)        constraint sdept_defa        default ('计算机科学'), scomegrade smallint         constraint cg_ck         check (scomegrade>=0 and scomegrade<=750) ) create table stu(sno char(10), sname varchar(8), ssex char(2)        constraint sex_ck                check (ssex in ('男','女')), sdept varchar(20)        constraint sdept_defa1                default ('计算机科学')

 

 

use TestBasego--创建表create table ProductInfos(   Id int identity(1001,1) primary key  not null,  --标识种子,增量   ProNo varchar(50) unique not null,   ProName nvarchar(20) not null,   TypeId int not null foreign key references ProductType(TypeId) ,   Price decimal(18,2) check(Price<10000) default (0.00) not null,   ProCount int default (0) null,)go--删除表drop table ProductInfosgo--在建表完成后,创建约束 create table ProductInfos(   Id int identity(1001,1)  not null,  --标识种子,增量   ProNo varchar(50)  not null,   ProName nvarchar(20) not null,   TypeId int not null ,   Price decimal(18,2)  not null,   ProCount int  null)go--主键  Idalter table ProductInfos add constraint PK_ProductInfos primary key(Id)--外键  TypeIdalter table ProductInfos add constraint FK_ProductInfos foreign key (TypeId) references ProductType(TypeId)--unique约束  ProNo

 

 

 

收录于合集 #sql  5个 下一篇SQL Server 数据操作 阅读 107   Linux分布式主任 58篇原创内容  

标签:constraint,外键,约束,key,SQL,table,主键
From: https://www.cnblogs.com/cherishthepresent/p/17522073.html

相关文章

  • PostgreSQL 是一种功能丰富的关系型数据库管理系统(DBMS),具有以下特色
    PostgreSQL是一种功能丰富的关系型数据库管理系统(DBMS),具有以下特色:开源和免费:PostgreSQL是一款开源软件,它的源代码可以免费获取和修改。这意味着您可以自由地使用、分发和修改PostgreSQL,而无需支付额外的费用。可靠性和稳定性:PostgreSQL以其出色的可靠性和稳定性而闻名。它......
  • mysql的表结构导出成word文档
     pararent的pow.xml<properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourc......
  • SQL编写规范
    SQL编写规范(1分钟上手)原创 kingdom 数码百科 2023-06-2800:45 发表于广东收录于合集#mysql12个#数据库14个#数据存储10个#大数据11个#数据仓库8个 SQL编写规范尽量避免使用select ,join语句使用select 可能导致只需要访问索引即可完成的查询需要回......
  • MySql管理
    系统数据库 常用工具 mysqlmysql-uroot-p123456itcast-e"select*fromstudent"---e前要加具体数据库mysqladmin mysqlbinlog mysqlshow mysqldump--数据备份,在windows命令行下执行,不需要在mysql命令行下执行----single-transacti......
  • 如何在AutoCAD中快速加载SQL Server、MySql、PostgreSQL数据库中的矢量数据?
    借助GIS4CAD插件能快速将SQLServer、MySql、PostgreSQL数据库中的矢量数据加载到AutoCAD,通过将矢量数据与数据库相结合,您可以更好地管理和分析您的CAD数据。方法/步骤下载并安装GIS4CAD插件http://www.geosaas.com/download/gis4cad.exe 下载并安装GIS4CAD插件,安装成功......
  • 如何在AutoCAD中快速将矢量数据导出到SQL Server、MySql、PostgreSQL数据库?
    在AutoCAD中借助GIS4CAD插件能快速将矢量数据导出到SQLServer、MySql、PostgreSQL数据库,通过将矢量数据与数据库相结合,您可以更好地管理和分析您的CAD数据。方法/步骤下载并安装GIS4CAD插件http://www.geosaas.com/download/gis4cad.exe 下载并安装GIS4CAD插件,安装成功......
  • 龙蜥7.9 rpm安装mysql
    1、拿到下图几个rpm包2、依次执行如下安装命令rpm-ivhmysql-community-common-5.7.19-1.el7.x86_64.rpm--nodeps--forcerpm-ivhmysql-community-libs-5.7.19-1.el7.x86_64.rpm--nodeps--forcerpm-ivhmysql-community-libs-compat-5.7.19-1.el7.x86_64.rpm--nodep......
  • mysql性能优化(博学谷)
      索引可以理解为一本书的目录,也是占页数,占存储空间的。key(关键字)-value(磁盘地址或行记录)。 根据关键字去索引里面查,数据结构是B+数,查询速度快。   哈希冲突: 通过key(k1,k2)的hashcode()获取哈希值,经过算法取得在数组上得下标位置,2个key取到了同一个下标,这就是哈希......
  • BackUpLogView 系列 - 生成日志数据库脚本(MS Sql Server)
     在企业管理器中执行脚本CREATEDATABASE[BackupLogview]ONPRIMARY(NAME=N'BackupLogview',FILENAME=N'C:\DATA\BackupLogview.mdf',SIZE=3072KB,MAXSIZE=UNLIMITED,FILEGROWTH=1024KB)LOGON(NAME=N'BackupLogview_log',F......
  • SQL注入之Oracle手工注入
    0x00.Oracle注入1.Oracle的数据类型是强匹配的(MYSQL有弱匹配的味道),所以在Oracle进行类似UNION查询数据时候必须让对应位置上的数据类型和表中的列的数据类型是一致的,也可以使用null代替某些无法快速猜测出数据类型的位置。1.基础知识//注释符多行注释:/**/,单行注释:--1......