首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql 建表主外键约束

基础概念

MySQL中的主键(Primary Key)和外键(Foreign Key)是关系型数据库中用于确保数据引用完整性的约束。主键是表中的一个或多个字段,它们唯一地标识表中的每一行记录。外键则是一个表中的字段,它引用了另一个表的主键,用于建立和强制执行两个表之间的链接。

优势

  • 数据完整性:主键确保了表中每一行的唯一性,而外键则确保了引用关系的正确性,防止了孤立记录的出现。
  • 简化查询:通过外键关联,可以方便地进行跨表查询,获取相关联的数据。
  • 结构化设计:主外键的使用有助于设计出更加结构化和层次化的数据模型。

类型

  • 单字段主键:一个表只能有一个主键,可以是一个字段。
  • 复合主键:由多个字段组成的主键,用于唯一标识表中的记录。
  • 单字段外键:一个字段引用另一个表的主键。
  • 复合外键:由多个字段组成的外键,这些字段联合起来引用另一个表的复合主键。

应用场景

  • 电商系统:订单表中的订单ID可以作为主键,而订单详情表中的订单ID可以作为外键,引用订单表的主键。
  • 社交网络:用户表中的用户ID作为主键,好友关系表中的用户ID可以作为外键,引用用户表的主键。

示例代码

代码语言:txt
复制
-- 创建用户表
CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE
);

-- 创建订单表
CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    order_date DATE NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);

遇到的问题及解决方法

问题:为什么我创建的外键约束没有生效?

  • 原因:可能是由于以下原因之一:
    • 引用的主键不存在。
    • 外键列的数据类型与引用的主键列的数据类型不匹配。
    • 表的存储引擎不支持外键约束(如MyISAM)。
  • 解决方法
    • 确保引用的主键存在并且数据类型匹配。
    • 检查并更改表的存储引擎为InnoDB,因为它是默认支持外键约束的存储引擎。
代码语言:txt
复制
ALTER TABLE orders ENGINE=InnoDB;

问题:如何删除外键约束?

  • 解决方法
代码语言:txt
复制
ALTER TABLE orders DROP FOREIGN KEY fk_user_id;

在这个例子中,fk_user_id 是外键约束的名称。如果未指定名称,MySQL会自动生成一个。

参考链接

通过以上信息,你应该能够理解MySQL中主外键约束的基础概念、优势、类型、应用场景,以及常见问题的解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

通过sql命令建表 和 主外键约束以及其他约束

emp_sex nchar(1), 11 dept_id int constraint fk_dept_id_b foreign key references dept(dept_id) --外键约束...创建表的命令后面是小括号(),而不是{}, 2. 注释用-- 3....主键外键可以命名,不然就是默认的名字 7....写完后,鼠标左键选中整个代码,分析、执行,最后生成表 什么是约束constraint: 对一个表中的属性操作的限制 分类: 主键约束:不允许重复元素,避免数据的冗余 外键约束:通过外键约束,从语法上保证了本事物所关联的其他事物一定是存在的...事物和事物之间的关系是通过外键来体现的 check约束:保证事物属性的取值在合法的范围之内 1 create table student 2 ( 3 stu_id int primary key

1.1K20

【数据库】MySQL进阶一、主外键讲解

MySQL进阶主外键讲解 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的...所以说,如果谈到了外键,一定是至少涉及到两张表。例如下面这两张表: ? 上面有两张表:部门表(dept)、员工表(emp)。...两张表必须都是InnoDB表,并且它们没有临时表。 注:InnoDB是数据库的引擎。MySQL常见引擎有两种:InnoDB和MyISAM,后者不支持外键。 2....MyISAM:不支持外键约束。不支持事务。对数据大批量导入时,它会边插入数据边建索引,所以为了提高执行效率,应该先禁用索引,在完全导入后再开启索引。 InnoDB:支持外键约束,支持事务。...CONSTRAINT symbol:可以给这个外键约束起一个名字,有了名字,以后找到它就很方便了。如果不加此参数的话,系统会自动分配一个名字。

2.1K70
  • 【MySql】表的约束

    表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。约束的本质是通过技术收到逼迫程序员插入正确的数据,反过来,站在mysql的视角,凡是插入进来的数据,都是符合数据约束的。...外键foreign key 外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。...,上面的例子,我们不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有。...建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。...address,邮箱email,性别sex,身份证card_id) 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums) 要求: 每个表的主外键

    56730

    【MYSQL】表的约束

    五、主键 主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。...这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息 七、唯一键 一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题...而我们设计员工工号的时候,需要一种约束:而所有的员工工号都不能重复。 具体指的是在公司的业务上不能重复,我们设计表的时候,需要这个约束,那么就可以将员工工号设计成为唯一键。...外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。...因此诞生了外键来约束。

    49540

    MySQL外键约束

    关系键是关系数据库的重要组成部分。关系键是一个表中的一个或几个属性,用来标识该表的每一行或与另一个表产生联系。...比如,学生跟老师之间是教学关系,学生数据表会有个属性叫指导老师(FK),而这个值就是对应到老师数据表的老师代号(PK),学生的指导老师就是外键。...注意 : 外键不一定要与相应主键同名,只是在应用中为便于识别,当主键与相应外键属于不同关系时,往往取同名 作用 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。...使两张表形成关联,外键只能引用外表中的列的值或使用空值。 案例 如果不使用外键,表2的学号字段插了一个值(比如20140999999),但该值在表1中并没有。...然而在设置外键时,你插入表2学号字段的值必须要求在表1的学号字段能找到。 同时,如果你要删除表1的某个学号字段,必须保证表2中没有引用该字段值的列,否则就没法删除。

    7.5K20

    mysql常见的建表选项和约束

    约束主要是防止非法数据进入表中,保证数据的正确性和一致性,统称为数据完整性 约束也可以防止一个表被删除 MySQL的约束保存在information_schema.table_constraints中...参照完整性约束,保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或者是两个表的两个字段之间的参照关系 注意: 具有外键约束的列的值不能随便给,必须满足外键所引用的主键的取值 一张表中可以定义多个外键...外键列默认可以给null值 父子表 外键所在的表叫做子表,从表 外键所引用的主键所在的表叫做父表,主表 constraint emp_deptid_fk foreign_key(deptid) references...MySQl中可以使用check约束,但是check约束对数据验证没有任何作用。...Oracle中国可以使用check约束,有相应作用 mysql> create table test_ck( -> id int check(id>0) -> ); mysql

    83110

    MySQL:表的约束

    表的约束和约束的目标 表的约束:表中一定要有各种约束,通过约束,让我们未来插入数据库中的数据是符合预期的。约束本质是通过技术手段,倒逼程序员,插入正确的数据。...主键 6.1 建表时定义主键 primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。...6.2 去掉主键 如果想去掉主键: 6.3 建表后添加主键 上面描述的是建表时就在相应数据类型后面表明主键,我们还可以在建表之后再添加主键。...并且建表之后添加主键需要保证在表中需要设置主键的那列元素不能冲突。...外键 外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

    37610

    表——完整约束性规则(键)

    key (FK) 标识该字段为该表的外键 not null 标识该字段不能为空 unique key (UK) 标识该字段的值是唯一的 auto_increment 标识该字段的值自动增长...下面的 SQL 在 "Orders" 表创建时在 "P_Id" 列上创建 FOREIGN KEY 约束: MySQL: CREATE TABLE Orders ( O_Id int NOT NULL,...当 "Orders" 表已被创建时,如需在 "P_Id" 列创建 FOREIGN KEY 约束,请使用下面的 SQL: MySQL / SQL Server / Oracle / MS Access:...先建被关联的表,并且被关联的字段必须唯一 create table department( id int primary key, name varchar(20) not null )engine=innodb...新表_字段名2) references 表1(字段名) on delete cascade on update cascade; 外键对应的字段数据类型必须一致,两张表的存储引擎必须一致,否则会出错

    2.5K70

    【MySQL】表的约束

    反过来,在 mysql 角度,凡是插入进来的数据,都是符合数据约束的!约束的最终目的就是保证数据的完整性和可预期性。因此我们需要更多的约束条件!...通过 show 看看 t3 表的建表语句: 可以看到 int(10),这个代表什么意思呢?整型不是 4 字节吗?这个 10 又代表什么呢?...但是可以插入空: 八、外键 外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或 unique 约束。...所以以上两张表现在只有关联关系,却没有约束关系,是有问题的!外键就很好地解决了这个问题,外键就是为这两张表建立外键约束。 那么我们要为哪个表添加外键约束呢?...建立外键的本质其实就是把相关性交给 mysql 去审核了,提前告诉 mysql 表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql 不允许你插入。

    40510

    表的约束(MySQL)

    通过show看看tt3表的建表语句: mysql> show create table tt3\G ***************** 1. row *****************      ...1.7 唯一键 一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以 解决表中有多个字段需要唯一性约束的问题。...:外键约束主要定义在从表上,主表则必须是有主键约束或unique 约束。...建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql 表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。...address,邮箱email,性别sex,身份证card_id) 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums) 要求: 每个表的主外键

    9410

    重温MySQL外键约束

    重温MySQL外键约束 MySQL的外键约束是用来在两个表之间建立链接的,其中一个表发生变化,另外一个表也发生变化。从这个特点来看,它主要是为了保证表数据的一致性和完整性的。...对于两个通过外键关联的表,相关联字段中主键所在的表是主表,也称之为父表,外键所在的表是从表,也称之为子表,定义外键的时候需要遵守几个规则: 1、父表必须已经存在于数据库中,或者是当前正在创建的表。...如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照。 2、必须为父表定义主键。 3、主键不能包含空值,但允许在外键中出现空值。...也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。 4、外键中列的数目必须和父表的主键中列的数目相同。 5、外键中列的数据类型必须和父表主键中对应列的数据类型相同。..._1上删除时,显示无法删除id=1的值,原因是有一个外键约束存在,也就是说,默认情况下,在父表进行删除时,无法直接删除子表中已经存在依赖关联的列值。

    7.2K10

    MySQL表的约束

    约束的本质: 通过技术手段倒逼程序员插入正确的数据。反过来站在mysql的视角,凡是插入进来的数据,都是符合数据约束的。 约束的最终目标: 保证数据的完整性和可预期性。 为什么数据库这么严格?...二.表的非空约束 1.NULL与’ '比较 在MySQL数据类型已经说过,这二者是不同的,NULL代表什么都没有,而' '代表一个空串。 在select语句中,NULL不会参与到相应的计算操作中。...三.默认值default 实际上就是缺省值,建表时设定之后,即便不对这个字段进行插入,其对应的值也会默认为default后面跟着的值。 插入default对应的字段后,就会将缺省值覆盖。...外键是用于定义主表和从表之间的关系 外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。...address,邮箱email,性别sex,身份证card_id) 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums) 要求: 每个表的主外键

    50550

    MySQL外键约束

    什么是外检约束 外键其实很好理解,简单的说就是两张表建立一个连接关系。这里我们那主表A和副表B举例,我A表中有用户信息,B表中有用户订单信息。...要是数据完整对应起来,肯定是需要把两张表关联起来,我们因此会在B表中村一个A表的字段,常见的我们存的是A表的主键ID外键。 外检约束要求 .MySQL的数据表存储引擎必须为Innodb。....主表和副表关联的字段数据类型的一致。 .字段不能设置为NULL。 .主表中的字段需为主键。 外键约束的作用 保证数据的完整性和一致性....SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。...NO ACTION: InnoDB拒绝删除或者更新父表。 4. RESTRICT: 拒绝删除或者更新父表。

    7K20

    MySQL数据库——表的约束(非空约束、唯一约束、主键约束、外键约束)

    目录 1 表的约束 约束,是对表中的数据进行限定,保证数据的正确性、有效性和完整性,约束分为以下几类: 主键约束:primary key 非空约束:not null 唯一约束:unique 外键约束:foreign...UNIQUE ); 注意:MySQL中唯一约束限定的列的值可以有多个null 2)删除唯一约束: -- alter table stu modify number varchar(20); 不同于非空约束的删除方法...以上仍然存在一个问题,当在员工表中输入不存的部门时,数据依然可以添加,不符合实际,因此,这里就可以通过使用外键约束来解决。 【概念】什么是外键约束?...外键,就是从表中与主表主键对应的那一列,如:员工表中的dep_id,其中,主表是一方,用来约束别人的表,从表可以是多方,被别人约束的表。 注意:外键可以为NULL,但是不能是不存在的外键值。 ?...; 3)在创建表后添加外键: ALTER TABLE 表名称 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称); -- 添加外键

    16K21

    Mysql外键约束

    如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。...外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。...外键主要用来保证数据的完整性和一致性 两个表必须是InnoDB表,MyISAM表暂时不支持外键 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立...如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。...外键约束使用最多的两种情况: 1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败; 2)父表更新时子表也更新,父表删除时子表匹配的项也删除。

    6.9K81

    oracle建表、建主键、外键基本语法

    主键:唯一标识,不能为空,加快查询速度,自动创建索引 外键:约束内表的数据的更新,从定义外键时可以发现 外键是和主键表联系,数据类型要统一,长度(存储大小)要统一。...这样在更新数据的时候会保持一致性 -创建表格语法: create table 表名( 字段名1 字段类型(长度) 是否为空, 字段名2 字段类型 是否为空...); -增加主键 alter table 表名 add constraint 主键名 primary key (字段名1); -增加外键: alter table 表名...add constraint 外键名 foreign key (字段名1) references 关联表 (字段名2); 在建立表格时就指定主键和外键 create table...varchar2(8) not null, constraint PK_T_STU primary key (STU_ID) ); 主键和外键一起建立

    3.4K50
    领券