Mysql之primary单列主键与复合主键

本文介绍了Mysql中innodb存储引擎对于主键的要求,包括单列主键和复合主键的概念及使用示例。单列主键通过id确保数据唯一,复合主键则允许由两个字段共同构成唯一标识,类似联合唯一的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mysql之primary主键

存储引擎(innodb):对于innodb存储引擎来说,一张表必须有一个主键。

1.单列主键
创建一个表:

create table t17(
        id int primary key,
        name char(16)
    )

往表内插入数据:

insert into t17 values
(1,'egon'),
(2,'elex')

运行,插入成功,我们来看下表:
在这里插入图片描述
再插入一条数据:

insert into t17 values(2,'elx')

运行——报错:
在这里插入图片描述
因为id设置了主键,已经存在了(这里类似unique)。

注:如果这样创建表 表也会显示为primary

create table t18(
    id int not null unique,
    name char(16)
    )

如果不设置id,继续插入数据:

insert into t17(name) values('wxx')

运行,查看数据:
在这里插入图片描述
运行一次,name为’wxx’的id是0,但是运行第二次时候,就会报错,因为已经存在了:
在这里插入图片描述

2.复合主键
复合主键和unique的联合唯一很像,下边我们来看看。

创建一个表:

create table t19(
	ip char(16),
    port int,
    primary key(ip,PORT)
    )

输入插入语句,往表内插入数据:

insert into t19 values('192.168.11.10',80),('192.168.11.10',80)

运行——报错:
在这里插入图片描述
因为插入的两个内容相同,所以会报错。下边我们修改下:

insert into t19 values('192.168.11.10',80),('192.168.11.10',81)

运行成功,我们来看下表内容:
在这里插入图片描述
这里二者port不同,运行成功。若ip不同port相同也可以运行成功,反正就是二者最多只能有一个相同,和联合唯一很相像。

<think>嗯,用户想知道如何在MySQL中设置主键和外键。首先,我需要回忆一下主键和外键的基本概念。主键是用来唯一标识表中每一行的列或列组合,而外键则是用来建立两个表之间的关联,确保引用完整性。 根据引用[2],主键的作用是加速查找和保证数据唯一性。创建主键可以在建表时直接指定,比如在列定义后加上PRIMARY KEY,或者在表定义的最后用PRIMARY KEY(列名)。还有联合主键的情况,比如引用[4]中的例子,用多个列作为主键。删除主键的话,需要用ALTER TABLE语句。 然后是外键,引用[3]提到外键约束用于关联两个表。主表的主键作为外键在从表中出现。创建外键的时候需要使用CONSTRAINT关键字,指定外键名和关联的列。要注意的是,外键列的数据类型必须和主表的主键一致,而且删除有外键约束的主表记录前,可能需要先处理从表的数据。 用户可能还需要知道如何删除外键约束,比如使用ALTER TABLE DROP FOREIGN KEY,这在引用[3]的例子中有提到。另外,事务隔离级别的设置可能影响外键约束的行为,但用户的问题主要是创建和配置,所以可能暂时不需要深入这部分。 还需要注意,主键不能包含空值,而外键可以,但非空的外键值必须存在于主表的主键中。这一点在引用[3]里也有说明。可能用户在使用时会遇到外键约束失败的情况,比如删除主表记录时,如果从表还有关联数据,就会报错,这时候需要先解除外键约束或者处理从表数据。 总结一下,回答应该分步骤说明主键和外键的创建方法,包括单列主键、联合主键,外键的创建和删除,以及注意事项。要给出具体的SQL示例,这样用户可以直接参考使用。同时,可能需要提醒用户关于外键约束的限制和常见错误,比如删除主表记录前必须处理从表数据,或者数据类型必须匹配等。 另外,根据用户提供的引用,尤其是引用[2]和[3],里面有很多具体的代码示例,需要整理成清晰的步骤。例如,创建主键的两种方式,创建外键时使用CONSTRAINT,以及删除外键的方法。可能还需要提到引擎的问题,因为MySQL中InnoDB引擎支持外键,而MyISAM不支持,所以建表时要指定引擎为InnoDB。 最后,生成相关问题的时候,要考虑用户可能的后续问题,比如主键和外键的区别,如何解决外键约束错误,或者性能方面的考虑。这样可以帮助用户更深入地理解相关概念。</think>### MySQL主键外键配置指南 #### 一、主键设置 主键PRIMARY KEY)用于唯一标识表中每一行数据,保证数据的唯一性和查询效率[^2]。 **1. 创建单列主键** ```sql -- 方式1:字段定义时直接指定 CREATE TABLE student( sid INT NOT NULL PRIMARY KEY, sname VARCHAR(30) ); -- 方式2:表定义最后统一指定 CREATE TABLE course( cid INT NOT NULL, cname VARCHAR(50), PRIMARY KEY(cid) ); ``` **2. 创建联合主键** ```sql CREATE TABLE score( student_id INT, course_id INT, score DECIMAL(5,2), PRIMARY KEY(student_id, course_id) -- 两列组合成主键 ); ``` **3. 修改已有表** ```sql -- 添加主键 ALTER TABLE employee ADD PRIMARY KEY(emp_id); -- 删除主键 ALTER TABLE employee DROP PRIMARY KEY; ``` *注意:主键列必须非空且值唯一[^2]* #### 二、外键设置 外键(FOREIGN KEY)用于建立表间关联,确保数据引用完整性[^3]。 **1. 创建外键约束** ```sql CREATE TABLE orders( order_id INT PRIMARY KEY, customer_id INT, CONSTRAINT fk_customer -- 显式命名约束 FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ) ENGINE=InnoDB; -- 必须使用InnoDB引擎 ``` **2. 级联操作配置** ```sql CREATE TABLE order_details( detail_id INT PRIMARY KEY, order_id INT, CONSTRAINT fk_order FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE -- 主表删除时同步删除 ON UPDATE SET NULL -- 主表更新时设为NULL ); ``` **3. 删除外键约束** ```sql ALTER TABLE orders DROP FOREIGN KEY fk_customer; ``` #### 三、注意事项 1. **数据类型匹配**:外键列必须主键列的数据类型完全一致 2. **索引要求**:MySQL会自动为外键创建索引,主键默认有唯一索引 3. **事务支持**:需要设置`transaction-isolation`级别保证一致性[^1] 4. **存储引擎**:必须使用InnoDB引擎才能支持外键约束[^3] 5. **删除顺序**:需先删除从表才能删除主表,或使用`CASCADE`选项 #### 四、最佳实践 ```sql -- 完整示例 CREATE TABLE departments( dept_id INT AUTO_INCREMENT PRIMARY KEY, dept_name VARCHAR(50) UNIQUE ) ENGINE=InnoDB; CREATE TABLE employees( emp_id INT AUTO_INCREMENT PRIMARY KEY, dept_id INT, emp_name VARCHAR(50), CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES departments(dept_id) ON DELETE SET DEFAULT ) ENGINE=InnoDB; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值