![](/img/trans.png)
[英]MySQL insert data into table with foreign keys that are no the primary key of the reference table
[英]MySQL: optimization of table (indexing, foreign key) with no primary keys
每個成員有0個或更多訂單。 每個訂單至少包含1個項目。 memberid-varchar,而不是整數-沒關系(請不要說那不是很好,我無法更改)。 因此,thera 3個表:members,orders和order_items。 訂單和order_items如下:
CREATE TABLE `orders` (
`orderid` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`memberid` VARCHAR( 20 ),
`Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`info` VARCHAR( 3200 ) NULL ,
PRIMARY KEY (orderid) ,
FOREIGN KEY (memberid) REFERENCES members(memberid)
) ENGINE = InnoDB;
CREATE TABLE `order_items` (
`orderid` INT(11) UNSIGNED NOT NULL,
`item_number_in_cart` tinyint(1) NOT NULL , --- 5 items in cart= 5 rows
`price` DECIMAL (6,2) NOT NULL,
FOREIGN KEY (orderid) REFERENCES orders(orderid)
) ENGINE = InnoDB;
因此,order_items表如下所示:
訂單編號-item_number_in_cart-價格:
...
1000456-1-24.99
1000456-2-39.99
1000456-3-4.99
1000456-4-17.97
1000457-1-20.00
1000458-1-99.99
1000459-1-2.99
1000459-2-69.99
1000460-1-4.99
...
如您所見, order_items表沒有主鍵(而且我認為沒有必要為此表創建auto_increment id,因為一旦我們要提取數據,我們就始終將其提取為WHERE orderid='1000456' order by item_number_in_card asc
-整個塊,id對查詢沒有幫助)。 一旦將數據插入order_items中,它就不會被更新,只是被選擇。
問題是:
先感謝您。
item_number_in_cart
上的item_number_in_cart
將不會使用。 這是一個很小的int,不夠有選擇性,並且一旦您有2條記錄,引擎甚至都不會考慮。 您可以將其作為第二列添加到orderid
上的現有索引中(由於您在orderid
上創建了FK約束,因此mysql會自動在該字段上添加索引)。
您說order_items
中的數據從未更新過,但我認為可以刪除; 在沒有主鍵的情況下這樣做將是有問題的。
好吧,無論如何我都會擁有一個autoinc,因為我非常相信代理鍵,但是正如alex07所建議的那樣,索引,甚至是orderid的主鍵,item_number_in_cart應該都可以解決。 請注意,item_number的順序將使用兩次通過排序(獲取數據,然后按數字順序對其進行排序),因此索引/鍵會直接將其切掉,因此即使使用代理鍵,您也希望該索引。
主鍵可以跨越多列。 您不能使用列的PRIMARY
屬性來執行此操作,但是可以定義具有多個列的單獨的主鍵:
CREATE TABLE `order_items` (
`orderid` INT(11) UNSIGNED NOT NULL,
`item_number_in_cart` tinyint(1) NOT NULL , --- 5 items in cart= 5 rows
`price` DECIMAL (6,2) NOT NULL,
PRIMARY KEY (orderid, item_number_in_cart),
FOREIGN KEY (orderid) REFERENCES orders(orderid)
) ENGINE = InnoDB;
而且,主鍵只是一個唯一鍵,其中每一列的名稱都不為空。 您可以在不可為空的列上創建自己的唯一鍵,以獲得相同的效果。
通過為item_number_in_cart
索引,您不太可能獲得很大的性能提升; 由於給定訂單的訂單項數量會減少,因此按item_number_in_cart
排序不會占用太多時間或內存。 但是,將列包含在主鍵中將有助於數據一致性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.