目的
讓資料庫資料看起來簡潔、不複雜。
同一天同一食物可以累加份量。
1.同一使用者/天/食物/只留下一筆資料
我在設定food_log表的欄位時,將log_id設為主鍵,保證每筆記錄唯一,但id、date、food_id不是主鍵,所以同一使用者、同一天、同一個食物可以新增很多筆資料。詢問gpt後,才知道要把id,date,food_id設合成主鍵,才能達到目的。
設合成主鍵:
- 在food_log表中先把重複資料刪除
SELECT id,date,food_id,COUNT(*)AS cnt:從資料表選出這三個欄位,並統一每一組出現次數。
GROUP BY id,date,food_id:照這三個欄位分組。
HAVING cnt>1 :只顯示出現次數大於一的(重複出現)。
- 只留最小log_id
DELETE FROM food_log WHERE log_id NOT IN():刪除不在(清單)的資料。
FROM(...)AS keep這裡用了子查詢再包一層的技巧,會先執行()裡的SELECT,把結果暫存一張表keep,最後在DELETE,這樣不會出錯。
SELECT MIN(log_id) AS log_id:找最小的log_id並把這個欄位暫時取做log_id。
GROUP BY id,date,food_id照這三個欄位分組。
- 結果
- 刪除原本主鍵
ALTER TABLE food_log MODIFY log_id INT: 修改資料表結構,將欄位log_id屬性改成int,因為AUTO_INCREMENT必須是primary key/UNIQUE,想移除主鍵要修改這個。
ALTER TABLE food_log DROP PRIMARY KEY:修改資料表結構,移除目前這個表上的主鍵。
- 結果

這裡測試到後面發現一定要把log_id這個欄位刪掉不然會出現問題

結果
-
新增新主鍵
這裡我發現我把data設為text類型,而MySQL不允許用text當作主鍵,所以把這欄位改成DATE型態。
ALTER TABLE food_log MODIFY COLUMN date DATE NOT NULL:修改資料表結構,指定修改欄位是date,改為DATE型態且不能為0。

變為:

開始設新主鍵。
ALTER TABLE food_log ADD PRIMARY KEY(id,date,food_id):修改資料表結構,將(id,date,foo_id)設為主鍵。

-
結果
