精华内容
下载资源
问答
  • 主键外键
    千次阅读
    2020-05-02 10:49:56
    create table SBook(
    	schoolYear TINYINT not null check(schoolYear in ('1','2','3','4','5','6','7','8')),/*取值范围*/
    	Number Smallint check(Number like '[0-9][0-9][0-9]' and Number!='000'),/*正则*/
    	courseNo char(3) not null, /*非空*/
    	bookNo char(6) not null check(bookNo like 'CN[0-9][0-9][0-9][0-9]'),/*正则*/
    	primary key(courseNo,bookNo), /*组合主键*/
    	foreign key(courseNo) references Course(courseNo) /*参照 references 不可少*/
    )
    
    更多相关内容
  • MySQL主键外键设定方法

    千次阅读 2021-03-15 21:53:27
    数据库 mysql 建立外键的前提:本表的列必须与外键类型相同(外键必须是外表主键)。外键作用: 使两张表形成关联,外键只能引用外表中的列的值!指定主键关键字: foreign key(列名)引用外键关键字: references ...

    数据库 mysql 建立外键的前提:本表的列必须与外键类型相同(外键

    必须是外表主键)。

    外键作用: 使两张表形成关联,外键只能引用外表中的列的值!

    指定主键关键字: foreign key(列名)

    引用外键关键字: references (外键列名)

    事件触发限制: on delete 和on update , 可设参数cascade(跟随外键改

    动), restrict(限制外表中的外键改动),set Null(设空值),set Default(设

    默认值),[默认]no action

    例如:

    outTable 表主键 id 类型int

    创建含有外键的表:

    create table temp(

    id int,

    name char(20),

    foreign key(id) references outTable(id) on delete cascade on update

    cascade);

    说明:把id 列设为外键参照外表 outTable 的id 列当外键的值删除

    本表中对应的列删除当外键的值改变本表中对应的列值改变。

    自己实践 才能完全了解外键的作用关键是:事件触发限制的作用

    restrict 在没有删除引用id 的时候不允许删除背引用id

    no action 在没有删除引用id 的时候不允许删除背引用id

    cascade 级联删除

    set null 在删除被引用id 的时候会把引用id 置为空

    有时没有外键设置选项是怎么回事呢?是因为storage engine 的原因,

    设置为ENGINE= InnoDB 就可以了。

    用 phpmyadmin 怎么建MySQL 的外键

    在 PHPMYADMIN 中暂时还没有见到所见即所得的外键定义方式.

    你可以使用SQL指令去建立

    语法如下:

    ALTER TABLE 表名ADD FOREIGN KEY (字段名) REFERENCES

    表名(字段名)

    如果直接删除外键,会报错

    首先先找到该外键的名称,FK_Relationship_77

    先操作删除外键名称

    alter table tbl_products drop foreign key FK_Relationship_77

    然后在操作删除字段

    alter table tbl_products drop column ProductLogicClassesId

    下面是一个实例

    首先,目前在产品环境可用的MySQL 版本(指4.0.x 和4.1.x)中,

    只有 InnoDB 引擎才允许使用外键,所以,我们的数据表必须使用

    InnoDB引擎。

    下面,我们先创建以下测试用数据库表:

    CREATE TABLE `roottb` (

    `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,

    `data` VARCHAR(100) NOT NULL DEFAULT '',

    PRIMARY KEY (`id`)

    ) TYPE=InnoDB;

    CREATE TABLE `subtb` (

    `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,

    `rootid` INT(11) UNSIGNED NOT NULL DEFAULT '0',

    `data` VARCHAR(100) NOT NULL DEFAULT '',

    PRIMARY KEY (`id`),

    INDEX (`rootid`),

    FOREIGN KEY (`rootid`) REFERENCES roottb(`id`) ON DELETE

    CASCADE

    ) TYPE=InnoDB;

    注意:

    1、必须使用InnoDB引擎;

    2、外键必须建立索引(INDEX);

    3、外键绑定关系这里使用了“ ON DELETE CASCADE”,意思是如果

    外键对应数据被删除,将关联数据完全删除,更多信息请参考MySQL

    手册中关于InnoDB的文档;

    好,接着我们再来插入测试数据:

    INSERT INTO `roottb` (`id`,`data`)

    VALUES ('1', 'test root line 1'),

    ('2', 'test root line 2'),

    ('3', 'test root line 3');

    INSERT INTO `subtb` (`id`,`rootid`,`data`)

    VALUES ('1', '1', 'test sub line 1 for root 1'),

    ('2', '1', 'test sub line 2 for root 1'),

    ('3', '1', 'test sub line 3 for root 1'),

    ('4', '2', 'test sub line 1 for root 2'),

    ('5', '2', 'test sub line 2 for root 2'),

    ('6', '2', 'test sub line 3 for root 2'),

    ('7', '3', 'test sub line 1 for root 3'),

    ('8', '3', 'test sub line 2 for root 3'),

    ('9', '3', 'test sub line 3 for root 3');

    我们先看一下当前数据表的状态:

    mysql>; show tables;

    +----------------+

    | Tables_in_test |

    +----------------+

    | roottb |

    | subtb |

    +----------------+

    2 rows in set (0.00 sec)

    mysql>; select * from `roottb`;

    +----+------------------+

    | id | data |

    +----+------------------+

    | 1 | test root line 1 |

    | 2 | test root line 2 |

    | 3 | test root line 3 |

    +----+------------------+

    3 rows in set (0.05 sec)

    mysql>; select * from `subtb`;

    +----+--------+----------------------------+

    | id | rootid | data |

    +----+--------+----------------------------+

    | 1 | 1 | test sub line 1 for root 1 |

    | 2 | 1 | test sub line 2 for root 1 |

    | 3 | 1 | test sub line 3 for root 1 |

    | 4 | 2 | test sub line 1 for root 2 |

    | 5 | 2 | test sub line 2 for root 2 |

    | 6 | 2 | test sub line 3 for root 2 |

    | 7 | 3 | test sub line 1 for root 3 |

    | 8 | 3 | test sub line 2 for root 3 |

    | 9 | 3 | test sub line 3 for root 3 |

    +----+--------+----------------------------+

    9 rows in set (0.01 sec)

    嗯,一切都正常,好,下面我们要试验我们的级联删除功能了。

    我们将只删除roottb 表中id 为2 的数据记录,看看subtb 表中rootid

    为2 的相关子纪录是否会自动删除:

    mysql>; delete from `roottb` where `id`='2';

    Query OK, 1 row affected (0.03 sec)

    mysql>; select * from `roottb`;

    +----+------------------+

    | id | data |

    +----+------------------+

    | 1 | test root line 1 |

    | 3 | test root line 3 |

    +----+------------------+

    2 rows in set (0.00 sec)

    mysql>; select * from `subtb`;

    +----+--------+----------------------------+

    | id | rootid | data |

    +----+--------+----------------------------+

    | 1 | 1 | test sub line 1 for root 1 |

    | 2 | 1 | test sub line 2 for root 1 |

    | 3 | 1 | test sub line 3 for root 1 |

    | 7 | 3 | test sub line 1 for root 3 |

    | 8 | 3 | test sub line 2 for root 3 |

    | 9 | 3 | test sub line 3 for root 3 |

    +----+--------+----------------------------+

    6 rows in set (0.01 sec)

    subtb 表中对应数据确实自动删除了,测试成功。

    结论:在MySQL中利用外键实现级联删除成功!

    展开全文
  • 主要介绍了如何分清SQL数据库中的主键外键,这里简单介绍下,方便需要的朋友
  • 主要介绍了MySQL中主键外键的区别和联系,是MySQL入门学习中的基础知识,需要的朋友可以参考下
  • MySQL基础之 主键外键设置

    千次阅读 2021-02-02 09:37:23
    外键:定义:如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。作用:外键是用来实现参照完整性的,不同的外键约束方式将可以是两张表紧密的结合起来。比如修改或者删除的级联...

    外键:

    定义:如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。

    作用:外键是用来实现参照完整性的,不同的外键约束方式将可以是两张表紧密的结合起来。比如修改或者删除的级联操作等,外键主要用来保证数据的完整性和一致性。

    条件:

    1、创建外键的两个表,父表与子表必须是InnoDB存储引擎。

    2、创建外键的时候,父表要创建索引,一般为主键索引。子表在创建外键的时候也必须要创建索引。

    3、子表的外键必须和父表的主键数据类型相对应(字段的类型和值必须一样或者相似,比如int也可以对应tinyint)。

    语法:

    下面这个是在子表中操作的:

    [CONSTRAINT Symbol] FOREIGN KEY [id](index_col_name,.....)REFERENCEStbl_name (index_col_name,...)[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

    [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

    其中Symbol仅仅是给约束自定义一个名称,方便以后我们删除约束。

    RESTRICT和NO  ACTION相同,是指限制在子表有关联记录的情况下父表不能进行操作。比如:DELETE  RESTRICT表示主表在删除记录的时候,如果子表有对应的记录,则不允许删除。比如UPDATE  CASCADE表示主表在更新记录的时候,如果子表有对应的记录,则子表也更新。(其实更新的就是主键和外键的那一列的值)。

    CASCADE:表示父表在更新或者删除时,也更新或者删除子表对应的记录。

    SET  NULL:表示父表的更新或者删除的时候,那么子表对应的字段被会SET  NULL。

    注意:当某个表被其他表创建了外键参照,那么该表的对应索引或者主键禁止被删除。

    例子:

    首先是我们创建两个表,一个是父表,一个是字表。字表设置有参照约束。

    mysql> create tablecountry(-> country_id smallint unsigned not nullauto_increment,-> country varchar(50) not null,-> last_update timestamp not null default current_timestamp on update current_timestamp,-> primary key(country_id)-> )engine=InnoDB default charset=utf8;

    Query OK,0 rows affected (0.10sec)

    mysql> desccountry;+-------------+----------------------+------+-----+-------------------+-----------------------------+

    | Field | Type | Null | Key | Default | Extra |

    +-------------+----------------------+------+-----+-------------------+-----------------------------+

    | country_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |

    | country | varchar(50) | NO | | NULL | |

    | last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |

    +-------------+----------------------+------+-----+-------------------+-----------------------------+

    3 rows in set (0.00sec)mysql> create tablecity(-> city_id smallint unsigned not nullauto_increment,-> city varchar(50) not null,-> country_id smallint unsigned not null,-> last_update timestamp not null default current_timestamp on update current_timestamp,-> primary key(city_id),-> keyidx_fk_country_id(country_id),-> constraint fk_city_country foreign key(country_id) references country(country_id) on delete restrict on update cascade

    -> )engine=InnoDB default charset=utf8;

    Query OK,0 rows affected (0.04sec)

    mysql> desccountry;+-------------+----------------------+------+-----+-------------------+-----------------------------+

    | Field | Type | Null | Key | Default | Extra |

    +-------------+----------------------+------+-----+-------------------+-----------------------------+

    | country_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |

    | country | varchar(50) | NO | | NULL | |

    | last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |

    +-------------+----------------------+------+-----+-------------------+-----------------------------+

    3 rows in set (0.00sec)mysql> insert into country values(1,‘English‘,now());

    Query OK, 1 row affected (0.00 sec)

    mysql> select * from country;

    +------------+---------+---------------------+

    | country_id | country | last_update |

    +------------+---------+---------------------+

    | 1 | English | 2018-10-25 10:34:49 |

    +------------+---------+---------------------+

    1 row in set (0.00 sec)

    mysql> desc city;

    +-------------+----------------------+------+-----+-------------------+-----------------------------+

    | Field | Type | Null | Key | Default | Extra |

    +-------------+----------------------+------+-----+-------------------+-----------------------------+

    | city_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |

    | city | varchar(50) | NO | | NULL | |

    | country_id | smallint(5) unsigned | NO | MUL | NULL | |

    | last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |

    +-------------+----------------------+------+-----+-------------------+-----------------------------+

    4 rows in set (0.00 sec)mysql> insert into city values(251,‘Kabul‘,1,now());

    Query OK,1 row affected (0.00sec)

    mysql> select * fromcity;+---------+-------+------------+---------------------+

    | city_id | city | country_id | last_update |

    +---------+-------+------------+---------------------+

    | 251 | Kabul | 1 | 2018-10-25 10:36:51 |

    +---------+-------+------------+---------------------+

    1 row in set (0.00sec)

    上面的“on update current_timestamp”表示更新表的记录的时候 ,也自动更新修改的时间。一句话“在创建新记录和修改现有记录的时候都对这个数据列刷新”。

    1、现在我们删除父表中的一个数据记录。

    mysql> delete from country where country_id=1;

    ERROR1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`exercise`.`city`, CONSTRAINT `fk_city_country` FOREIGN KEY (`country_id`) REFERENCES `country` (`country_id`) ON UPDATE CASCADE)

    我们发现是删除不了的,因为字表参照了父表的一个记录(我们在字表参照里面设置了“限制在字表有关联的情况下父表不能删除”---delete  restrict)

    2、然后我们更新一个记录看看。

    mysql> update country set country_id=251 where country=‘English‘;

    ERROR1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY columnmysql> SET SQL_SAFE_UPDATES=0; #我是以安全模式启动的mysql,设置一下就可以了

    Query OK,0 rows affected (0.00sec)

    mysql> update country set country_id=251 where country=‘English‘;

    Query OK,1 row affected (0.01sec)

    Rows matched:1 Changed: 1 Warnings: 0mysql> select * fromcountry;+------------+---------+---------------------+

    | country_id | country | last_update |

    +------------+---------+---------------------+

    | 251 | English | 2018-10-25 10:47:01 |

    +------------+---------+---------------------+

    1 row in set (0.00sec)

    mysql> select * fromcity;+---------+-------+------------+---------------------+

    | city_id | city | country_id | last_update |

    +---------+-------+------------+---------------------+

    | 251 | Kabul | 251 | 2018-10-25 10:38:28 |

    +---------+-------+------------+---------------------+

    1 row in set (0.00 sec)

    我们更新的父表的主键记录,发现子表的外键记录也自动更新了,因为子表的外键参照父表的主键。并且子表在约束条件里面写了"update cascade"。

    3、现在我们删除父表的主键

    mysql> alter table country drop columncountry_id;

    ERROR1829 (HY000): Cannot drop column ‘country_id‘: needed in a foreign key constraint ‘fk_city_country‘ of table ‘exercise.city‘

    当某个表被其他表创建了外键参照,那么该表的对应索引或者主键禁止被删除。

    还有一些需要注意的:

    在导入多个表的数据的时候,如果需要忽略表之前的导入顺序,可以暂时关闭外键的检查,在执行load data和alter table操作的时候,可以暂时关闭外键约束来加快处理的速度。关闭的指令是“SET FORENGN_KEY_CHECKS=0”;执行完成之后,通过执行"SET FOREIGN_KEY_CHECKS=1"语句改回原始状态。

    原文:https://www.cnblogs.com/FengGeBlog/p/9848530.html

    展开全文
  • 关系型数据库和主键外键

    千次阅读 2021-01-11 21:55:07
    一对一:既可以把表A的主键充当表B的外键,也可以把表B的主键充当表A的外键(一个人只有一把钥匙,一把钥匙只给一个人) 一对多:把表A的主键充当表B的外键(一个父亲有几个孩子,一个孩子只有一个父亲) 多对多:...

    SQL server的基础学习3

    一、什么是关系

    定义:表与表之间的联系
    实现方法:通过设置不同形式的外键来体现表和表的不同关系

    一对一

    既可以把表A的主键充当表B的外键,也可以把表B的主键充当表A的外键(一个人只有一把钥匙,一把钥匙只给一个人)

    一对多

    一对多:把表A的主键充当表B的外键(一个部门有多个员工,一个员工只能在一个部门)
    在多的一方添加外键(在员工表中添加外键即:员工表为外键表,部门表是主键表)
    在这里插入图片描述
    在这里插入图片描述

    多对多

    多对多:必须通过单独的一张表来实现(一个老师多个学生,一个学生多个老师)班级一张表,老师一张表,班级和老师的关系一张表
    在这里插入图片描述
    在这里插入图片描述 在这里插入图片描述

    二、主键和外键

    主键

    定义:能够唯一标示一个事物的一个字段或者多个字段的组合
    附注:
    1、含有主键的叫做主键表,主键通常都是整数,不建议用字符串当主键(如果主键是用于集群式服务,才可以考虑用字符串当主键)
    2、主键的值通常都不允许修改,除非本记录被删除
    3、主键不要定义成id,而要定义成表面_id
    4、要用代理主键,不要用业务主键(任何一张表都不建议使用有业务含义的字段充当主键,我们通常都是在表中单独添加一个整型的编号充当主键字段)

    外键

    定义:如果一个表中的若干个字段是来自另外若干个表的主键或唯一键,则这若干个字段就是外键
    附注:
    1、外键通常都是来自另外表的主键而不是唯一键,因为唯一键可能为null
    2、外键不一定是来自另外的表,也可能来自表的主键(员工表中上层管理人员也是员工中的数据)
    3、含有外键的表叫外键表,外键字段来自的呢一张表叫做主键表
    问题:先删除主键表还是外键表?
    答:先删除外键表
    如果先删除主键表会报错,因为这会导致外键表中的数据引用失败

    展开全文
  • 一、什么是主键外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的...
  • 简单的建表联系,包括主键外键,帮助新手快速熟悉建表的语句操作
  • 外键用于在一个数据表中引入另一个表的主键 用于当两个表有联系 且一个表的某一类数据 需要用到另一个表的主键元素 则这类数据可设置为外键 例子: 左侧员工表的所属部门的数据 只能来自于右边的公司部门表的部门...
  • 主键外键超键候选键区别以及联系

    千次阅读 2022-03-04 17:18:49
    主键超键
  • ————总目录——前言——框架版本———— ...三、模型(models)主键外键 1 主键 梳理自官方文档:automatic-primary-key-fields 不设置主键的情况下,Django会自动为每个模型提供以下字段: id = .
  • mysql主键 外键

    2021-01-27 15:08:51
    1.主键的作用主键是能确定一条记录的唯一标识,主键字段必须唯一,必须非空,一个表中只能有一个主键主键可以包含一个或多个字段。打个比方,一条记录包括身份正号,姓名,年龄,学校,国籍,性别等。身份证号是...
  • 在SQL Server中建立主键外键的关系

    千次阅读 2021-03-14 16:24:33
    其中CNum是主键,但是在Course表中出现了TNum,因此,我希望Course表中的TNum作为Teacher表中主键TNum的外键。 操作如下 右键点击“键”->“新建外键”->“添加” 随后出现以下界面: 点击“表和列规范右侧...
  • PowerDesigner中主键外键唯一键设置

    千次阅读 2019-10-26 20:08:16
    设置主键 1、在右侧 “工具栏”,点击下图图标 “创建表” 2、在 “General” 中,设置 “Name” 和 “Code” 2、在 “Columns” 中,设置 “Name” 、 “Code”、“Data Type” 、“Length” 、“Precision” 、...
  • MYSQL--主键 外键

    2021-10-31 17:40:06
    文章目录添加主键外键 添加主键 相关知识 主键,是表中一列或者多列的组合,主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空,主键能够唯一的标识表中的每一条记录,可以结合外键来定义与...
  • ③山竹主键记录表时,你可以在建外键时选定外键记录一起级联删除还是拒绝删除。④更新主键记录时,同样有联级更新和拒绝执行的选择。总结:SQL的主键外键起约束的作用。主键 是确定一条记录唯一的标识,外键用于...
  • SQLyog数据库:主键外键代码添加

    千次阅读 2021-03-04 16:19:53
    主键添加 alter table 表名 constraint 主键名 primary ley 表名(字段); 添加外键 alter tadle 表名 constraint 外键名 forelgn ley (外键字段) references 关联表名(关联字段);
  • 主键主键外键和索引A “key” is one of the most basic and important concepts of the Database Management System (DBMS); the keys helps us work easily with the records and the tables in our database by ...
  • sql 语句,主键外键详解

    千次阅读 2016-06-22 15:55:42
    SQL的主键外键的作用:  外键取值规则:空值或参照的主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能插入。 (2)更新时,不能改为主键表中没有的值。 (3)删除主键表记录时,你可以在建外键...
  • 单表创建主键 外键 创建表时 以创建user表为例 : create table user( id int PRIMARY KEY auto_increment, name VARCHAR(20), age int, birthday date, dept_id int, constraint emp_deptid_fk foreign key(dept_id...
  • 6.4 特点 ①从表的外键列,必须引用/参考主表的主键或唯一约束的列。 ②在创建外键约束时,如果不给外键约束命名,默认名不是列名,而是自动产生一个外键名(例如student_ibfk_1;),也可以指定外键约束名。 ③创建...
  • 主键主键外键和索引 Primary and foreign keys are a way in which to constrain related data together to ensure data in your database remains consistent and to ensure no redundant data is in the database...
  • 数据库 主键 外键 唯一键区别

    万次阅读 2018-11-13 19:57:15
    下面我通过一个小栗子来说明我们应该如何选择主键外键和唯一键。 现在我们想建立学生表,用来存储,一个系统的登陆信息。建表如下: create table student4 ( stu_id int primary key identity,--identity表示...
  • 主键外键

    2021-08-28 19:54:50
    外键(FOREIGN KEY) 主键(PRIMARY KEY) 主键(PRIMARY KEY)的完整称呼是“主键约束”。 MySQL主键约束是一个列或者列的组合,其值能唯一地标识表中的每一行。 这样的一列或多列称为表的主键,通过它可以强制...
  • MYSQL 索引 主键 外键

    2017-05-14 18:51:29
    MYSQL 索引 主键 外键解释: 索引可分为普通索引和唯一索引,主要用于提高访问速度,普通索引允许索引列内容重复,唯一索引不允许重复; 主键具有唯一索引的特性,用于唯一标识记录,一个表只能一个主键外键具有...
  • SQLite的主键外键

    千次阅读 2016-03-24 17:28:43
    主键外键  一、什么是主键外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键  比如  学生表(学号,姓名,性别,班级)...
  • 小知识系列:数据库的主键外键

    万次阅读 2021-10-12 09:21:50
    文章目录简介创建主键MySQLOracleSQL Server创建外键mysqlOracleSQL Server总结 简介 数据库是我们所有应用程序的基础,没有数据库的程序不是一个好程序,一般情况下我们都是通过可视化工具来创建数据库和数据库表格...
  • title: 数据库的主键外键索引 date: 2018-04-08 16:03:01 uodated: 2020-03-07 14:05:24 categories: 数据库 tags: - 数据库 这是一篇数据库的主键、外键、索引的学习笔记 数据库的主键外键索引 主键、外键和索引...
  • MySQL的主键外键

    千次阅读 2021-02-04 14:45:16
    概念表能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。插入相同主键的两条记录是不被允许的。MySQL主键设计原则:不使用任何业务相关的字段作为主键永远也不要更新MySQL主键,修改主键会造成一系列的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 184,349
精华内容 73,739
关键字:

主键外键

友情链接: 背景JS特效代码.rar