2015-04-24 24 views
0

在項目分配中,我希望在其他部分更改值後重置PRIMARY KEY的一部分。例如:使AUTO_INCREMENT在更改父代時自行重置ID

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 AUTO_INCREMENT功能不能正常工作,因爲我打算在這種情況下。當我插入這些值(記住AUTO_INCREMENT功能上的ID,因爲我不定義在INSERT報表centerIDstaffID):

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重置爲1,當centerID更改值。這是我想要的結果(注意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的要求總是在這種情況下獨特的,我不明白爲什麼這不應該工作。有什麼我想在這裏實現的解決方案?

+0

這不是auto_increment的工作方式。 auto_increment只爲最後插入的值添加一個值。 – Jens

+0

AUTO_INCREMENT功能在此之前爲我完成了這項工作,但它在工作時以及不工作時似乎是隨機的。我認爲這可能是按照正確的順序設置PRIMARY KEY,或者按順序設置FOREIGN KEY,但到目前爲止,這對我來說似乎是隨機的。 – LifeOfAStudent

+0

看來你對'auto_increment'的工作是什麼感到困惑。你知道,但是**真的知道,主鍵的工作是什麼? –

回答

1

我會嘗試你的問題回答到這種地步,我解釋一下這是怎麼回事。

首先,您需要的功能在MyISAM存儲引擎中可用(有一種扭曲)。但是,交易和參照完整性不可用。

現在爲auto_increment - 它給行賦予唯一值。但是,它通過考慮併發來實現此目的 - 這意味着如果兩個或更多人連接並執行一些工作,則auto_increment將在該場景中爲兩個人正確計算,如果他們正在訪問同一個表。

這意味着每個插入的auto_increment只會增加。與以往的記錄沒有任何關係,這就是爲什麼auto_increment速度很快,並且您可以100%確定地獲得唯一標識符。

發生的另一個有用的事情是InnoDB根據這個數字執行聚類。換句話說,它使用這個數字來執行其內部數據結構平衡,以便在稍後階段提供性能(讀取/更新記錄)。

現在爲什麼這很重要 - 如果你改變這個數字,InnoDB將以任何方式重新平衡它的B-Tree,這將需要一些時間來做到這一點。這意味着 - 從不觸摸主鍵值

但是,所有這些並不真正相關。有什麼相關的是以下 - 爲什麼你需要staffID來改變嗎?如果你保持原樣,沒有什麼不好的事情會發生。

+0

我意識到可以保留原樣,但允許我用另一個問題回答您的問題:如何防止員工ID的AUTO_INCREMENT重置?因爲它隨機按照我在OP中要求的方式進行,所以我寧願有一種情況比兩種情況都要好。 – LifeOfAStudent

+0

我必須承認,當你說它重新設置時,我不太明白。所有'auto_increment'都會給你一個更高的數字 - 他們甚至不需要連續,他們之間可能會有差距。無論如何,你的桌子是「MyISAM」桌子嗎? –

+0

通過重置,我的意思是它再次從1開始,並且'AUTO_INCREMENT's。這確實是一個'MyISAM'表。 – LifeOfAStudent

0

它與auto_increment無關。

我認爲你應該以不同的方式設計你的表格。你現在設計的是一對多的關係,但你需要多對多的關係。

因此,「職員1」可以是兩個購物中心的僱員。您應該創建中間錶鏈接shopping_centerstaff

這是對錶格結構的更正。

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; 

其結果將是

+0

那麼你的建議是每個購物中心都有一張桌子?在這種情況下,staffID不會重置,對吧? – LifeOfAStudent

+0

請參閱我更新的答案以獲取更多詳細信息。在我所描述的結構中,有一個關於購物中心的記錄,一個員工記錄,兩個記錄中心和工作人員之間的關係。 – Stepashka

+0

在這個例子中,應該有四個不同的人,在這個項目中,每個購物中心都需要註冊一次。 – LifeOfAStudent