在项目分配中,我希望PRIMARY KEY的一部分在另一部分更改值后重置。例如:
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语句中定义centerID或staffID ):
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");我得到了这个结果:
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值的变化):
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在本例中始终是唯一的,我不明白为什么这不应该工作。我在这里想要实现的目标有什么解决办法吗?
发布于 2015-04-24 14:52:11
我会试着回答你的问题,解释一下到底发生了什么。
首先,您想要的特性可以在MyISAM存储引擎中使用(有点扭曲)。然而,事务和引用完整性是不可用的。
现在对于auto_increment,它为行提供了唯一的值。但是,它是通过考虑并发性来做到这一点的--这意味着如果两个或更多人连接并执行某些工作,则如果两个人都访问相同的表,则auto_increment将在该场景中正确计算。
这意味着,对于每一个插入,auto_increment只会增加。这与任何记录都没有任何关系,这就是为什么auto_increment是快速的,并且您得到的唯一标识符具有100%的确定性。
发生的另一件有用的事情是,InnoDB根据这个数字执行集群。换句话说,它使用这个数字来执行内部数据结构平衡,以便在稍后阶段(读取/更新记录)提供性能。
为什么这很重要--如果你改变这个数字,无论如何,InnoDB会重新平衡它的B树,这需要一些时间。它的意思是-从不触摸主键值。
然而,所有这些并不是真正相关的。与此相关的是以下内容--为什么需要staffID来改变呢?如果你保持现状,就不会有什么不好的事情发生。
发布于 2015-04-24 11:50:51
这与auto_increment无关。
我认为你应该把你的桌子设计的不同。你现在设计的是一对多的关系,但你需要多对多。
这样“工作人员1”就可以成为两个购物中心的雇员了。您应该创建连接shopping_center和staff的中间表
这是对您的表结构的更正。
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; 结果将是
+----------+---------+---------------+
| centerID | staffID | name |
+----------+---------+---------------+
| 1 | 1 | Staffmember 1 |
| 1 | 2 | Staffmember 2 |
| 2 | 1 | Staffmember 1 |
| 2 | 2 | Staffmember 2 |
+----------+---------+---------------+https://stackoverflow.com/questions/29846636
复制相似问题