mysql学习之 外键

定义:MySQL的外键约束(FOREIGN KEY)是表的一个特殊字段。对于两个具有关联关系的表而言,相关联字段中的主键所在表就是主表(父表),外键所在的表就是从表(子表)。
要点:主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
具体操作:
方式1:在创建表时定义外键:

CREATE TABLE classes(
    id INT(4) NOT NULL PRIMARY KEY,
    NAME VARCHAR(36)
    -- 有主键  是主表
);

CREATE TABLE student(
	sid INT(4) NOT NULL PRIMARY KEY,
	sname VARCHAR(30),
	cid INT(4),
	CONSTRAINT fk_cid FOREIGN KEY(cid) REFERENCES classes(id)  -- 只有主表中的主键才可以作为外键关联
	-- 有外键  是从表
DROP TABLE classes;  -- Cannot delete or update a parent row: a foreign key constraint fails
ALTER TABLE student DROP FOREIGN KEY fk_cid;  -- 删除外键约束
DROP TABLE classes;  -- DROP TABLE classes
-- 在解除掉外键约束后方可删除掉从表

);

在操作中遇到一种情况是:添加外键约束后仍然可以删除掉主表,其中的原因在于定义表时默认的引擎不是InnoDB,需要手动设置或者定义表时标明默认引擎
方式2:通过语句配置添加外键约束

REATE TABLE classes2(
    id INT(4) NOT NULL PRIMARY KEY,
    NAME VARCHAR(36)
);

CREATE TABLE student2(
    sid INT(4) NOT NULL PRIMARY KEY,
    sname VARCHAR(30),
    cid INT(4) NOT NULL
);
ALTER TABLE student2 ADD CONSTRAINT fk_cid2 FOREIGN KEY(cid) REFERENCES classes2(id);
DROP TABLE classes2;  -- Cannot delete or update a parent row: a foreign key constraint fails
ALTER TABLE student2 DROP FOREIGN KEY fk_cid2;  -- 删除外键约束
DROP TABLE classes2;  -- DROP TABLE classes2
<think>嗯,用户想了解如何在MySQL中创建主键和外键的SQL语句。好的,我需要先回忆一下相关的知识,然后根据提供的引用内容来整理答案。 首先,主键是用于唯一标识中每一行的列或列组合,而外键则用于建立两个之间的关联。根据引用[1],创建主键可以在创建时定义,或者在已有上添加。比如在CREATE TABLE的时候使用PRIMARY KEY关键字,或者在现有上通过ALTER TABLE添加。比如引用[3]中提到,使用ALTER TABLE users ADD PRIMARY KEY (user_id)来添加主键。 然后是外键,引用[4]中提到,可以在创建时定义FOREIGN KEY,并指定REFERENCES父的列。或者在已有上使用ALTER TABLE添加外键约束。例如,在创建子时,FOREIGN KEY (parent_id) REFERENCES parent_table(id)。还有引用[5]提到,如果原有主键需要删除,可以使用ALTER TABLE DROP PRIMARY KEY,然后再添加新的主键。 用户可能需要具体的示例,所以应该给出创建时和修改时的SQL语句。比如在创建时如何设置主键,包括单字段主键和复合主键。外键部分也需要说明在创建时和之后如何添加,并且注意外键约束的选项,如ON DELETE和ON UPDATE。 还需要注意自增属性,主键通常和自增一起使用,比如使用AUTO_INCREMENT,这在引用[1]和[4]中都有提到。例如,id INT AUTO_INCREMENT PRIMARY KEY。 用户可能遇到的问题包括如何删除原有主键,这在引用[5]中提到,需要用ALTER TABLE DROP PRIMARY KEY。但需要注意,如果原有主键是自增的,可能需要先修改列属性,再删除主键,不过这可能超出当前问题的范围,但可以简要提及。 另外,外键需要确保父的列存在索引,并且存储引擎是InnoDB,否则可能不支持外键约束。这点可能在引用中没有提到,但根据MySQL的知识,需要补充说明,以避免用户在使用时出现错误。 总结一下,回答的结构应该分为创建主键和创建外键两部分,每部分再分为创建时和修改已有两种情况,并给出示例。同时,注意事项也需要提到,比如存储引擎、索引、约束条件等。 现在需要检查是否有遗漏的引用内容,比如引用[2]和[3]可能提供其他信息,但根据内容,引用[3]提到添加主键的方法,引用[4]和[5]涉及外键的创建和修改。需要确保所有相关的操作都有覆盖,比如删除主键的步骤,但用户的问题主要是创建,所以可能不需要详细展开删除部分,除非必要。 最后,生成相关问题,可能需要包括主键外键的区别、如何删除、性能影响、修改约束等,这些可以帮助用户进一步学习。</think>### MySQL主键与外键创建方法 #### 一、主键创建方法 主键用于唯一标识中的每一条记录,**创建方式分为建时定义和后期添加**: 1. **建时定义主键** - 单字段主键: ```sql CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL ); ``` - 复合主键(多字段组合): ```sql CREATE TABLE orders ( order_id INT, product_id INT, PRIMARY KEY (order_id, product_id) ); ``` 2. **已有添加主键** ```sql ALTER TABLE employees ADD PRIMARY KEY (emp_id); ``` **注意**:若已有主键需先删除原主键[^5]: ```sql ALTER TABLE jingyan DROP PRIMARY KEY; ``` #### 二、外键创建方法 外键用于关联两个的数据,**需确保父存在对应主键且使用InnoDB引擎**: 1. **建时定义外键** ```sql CREATE TABLE orders ( order_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE ON UPDATE CASCADE ); ``` 2. **已有添加外键** ```sql ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(user_id); ``` #### 三、核心注意事项 1. **自增属性**:主键常配合`AUTO_INCREMENT`实现自动编号[^1] 2. **外键约束条件**: - `ON DELETE CASCADE`:父记录删除时自动删除子关联记录 - `ON UPDATE CASCADE`:父主键更新时同步更新子外键 3. **引擎限制**:仅InnoDB引擎支持外键约束[^4] 4. **索引要求**:外键字段会自动创建索引以提高查询效率 $$ \text{外键关系公式:} \boxed{\text{子.外键字段} \subseteq \text{父.主键字段}} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值