首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使AUTO_INCREMENT在更改父ID时自动复位

使AUTO_INCREMENT在更改父ID时自动复位
EN

Stack Overflow用户
提问于 2015-04-24 11:42:38
回答 2查看 100关注 0票数 0

在项目分配中,我希望PRIMARY KEY的一部分在另一部分更改值后重置。例如:

代码语言:javascript
复制
CREATE TABLE shopping_center(
    centerID INTEGER AUTO_INCREMENT,
    centerName CHAR(50),
    CONSTRAINT center_PK PRIMARY KEY(centerID));

CREATE TABLE staff(
    staffID INTEGER AUTO_INCREMENT,
    centerID INTEGER,
    name VARCHAR(50),
    CONSTRAINT staff_PK PRIMARY KEY(staffID, centerID));

ALTER TABLE staff
    ADD CONSTRAINT staff_FK
    FOREIGN KEY(centerID) 
    REFERENCES shopping_center(centerID);

在这种情况下,MySQL的MySQL特性不像我想要的那样工作。当我插入这些值时(请记住ID上的AUTO_INCREMENT特性,因为我没有在INSERT语句中定义centerIDstaffID ):

代码语言:javascript
复制
INSERT INTO shopping_center (centerName) VALUES("A Shopping Center");
INSERT INTO shopping_center (centerName) VALUES("Another Shopping Center");

INSERT INTO staff (centerID, name) VALUES(1, "Staffmember 1 in centerID 1");
INSERT INTO staff (centerID, name) VALUES(1, "Staffmember 2 in centerID 1");
INSERT INTO staff (centerID, name) VALUES(2, "Staffmember 1 in centerID 2");
INSERT INTO staff (centerID, name) VALUES(2, "Staffmember 2 in centerID 2");

我得到了这个结果:

代码语言:javascript
复制
SELECT centerID, staffID, name FROM staff; 
+----------+---------+-----------------------------+
| centerID | staffID | name                        |
+----------+---------+-----------------------------+
|         1|        1| Staffmember 1 in centerID 1 |
|         1|        2| Staffmember 2 in centerID 1 |
|         2|        3| Staffmember 1 in centerID 2 |
|         2|        4| Staffmember 2 in centerID 2 |
+----------+---------+-----------------------------+

但是我想要的是当staffID更改值时,centerID重置为1。这是我想要的结果(注意staffID值的变化):

代码语言:javascript
复制
SELECT centerID, staffID, name FROM staff; 
+----------+---------+-----------------------------+
| centerID | staffID | name                        |
+----------+---------+-----------------------------+
|         1|        1| Staffmember 1 in centerID 1 |
|         1|        2| Staffmember 2 in centerID 1 |
|         2|        1| Staffmember 1 in centerID 2 |
|         2|        2| Staffmember 2 in centerID 2 |
+----------+---------+-----------------------------+

由于所需的PRIMARY KEY在本例中始终是唯一的,我不明白为什么这不应该工作。我在这里想要实现的目标有什么解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-24 14:52:11

我会试着回答你的问题,解释一下到底发生了什么。

首先,您想要的特性可以在MyISAM存储引擎中使用(有点扭曲)。然而,事务和引用完整性是不可用的。

现在对于auto_increment,它为行提供了唯一的值。但是,它是通过考虑并发性来做到这一点的--这意味着如果两个或更多人连接并执行某些工作,则如果两个人都访问相同的表,则auto_increment将在该场景中正确计算。

这意味着,对于每一个插入,auto_increment只会增加。这与任何记录都没有任何关系,这就是为什么auto_increment是快速的,并且您得到的唯一标识符具有100%的确定性。

发生的另一件有用的事情是,InnoDB根据这个数字执行集群。换句话说,它使用这个数字来执行内部数据结构平衡,以便在稍后阶段(读取/更新记录)提供性能。

为什么这很重要--如果你改变这个数字,无论如何,InnoDB会重新平衡它的B树,这需要一些时间。它的意思是-从不触摸主键值

然而,所有这些并不是真正相关的。与此相关的是以下内容--为什么需要staffID来改变呢?如果你保持现状,就不会有什么不好的事情发生。

票数 1
EN

Stack Overflow用户

发布于 2015-04-24 11:50:51

这与auto_increment无关。

我认为你应该把你的桌子设计的不同。你现在设计的是一对多的关系,但你需要多对多。

这样“工作人员1”就可以成为两个购物中心的雇员了。您应该创建连接shopping_centerstaff的中间表

这是对您的表结构的更正。

代码语言:javascript
复制
CREATE TABLE shopping_center(
centerID INTEGER AUTO_INCREMENT,
centerName CHAR(50),
CONSTRAINT center_PK PRIMARY KEY(centerID));

CREATE TABLE staff(
staffID INTEGER AUTO_INCREMENT,
name VARCHAR(50),
CONSTRAINT staff_PK PRIMARY KEY(staffID, centerID));

CREATE TABLE shopping_center2staff(
centerID INTEGER,
staffID INTEGER,
CONSTRAINT center_PK PRIMARY KEY(centerID, staffID));

ALTER TABLE shopping_center2staff
ADD CONSTRAINT staff_FK
FOREIGN KEY(staffID) 
REFERENCES staff(staffID);

ALTER TABLE shopping_center2staff
ADD CONSTRAINT center_FK
FOREIGN KEY(centerID) 
REFERENCES shopping_center(centerID);

INSERT INTO shopping_center (centerName) VALUES("A Shopping Center");
INSERT INTO shopping_center (centerName) VALUES("Another Shopping Center");

INSERT INTO staff (name) VALUES("Staffmember 1");
INSERT INTO staff (name) VALUES("Staffmember 2");

INSERT INTO `shopping_center2staff` (centerID, staffID) VALUES(1,1);
INSERT INTO `shopping_center2staff` (centerID, staffID) VALUES(1,2);
INSERT INTO `shopping_center2staff` (centerID, staffID) VALUES(2,1);
INSERT INTO `shopping_center2staff` (centerID, staffID) VALUES(2,2);

SELECT sc2s.centerID, sc2s.staffID, name 
FROM shopping_center2staff as sc2s
JOIN `staff` as s on sc2s.staffID = s.staffID
JOIN `shopping_center` as sc on sc2s.centerID = sc.centerID
order by sc2s.centerID; 

结果将是

代码语言:javascript
复制
+----------+---------+---------------+
| centerID | staffID | name          |
+----------+---------+---------------+
|        1 |       1 | Staffmember 1 |
|        1 |       2 | Staffmember 2 |
|        2 |       1 | Staffmember 1 |
|        2 |       2 | Staffmember 2 |
+----------+---------+---------------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29846636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档