SELECT c1.id FROM category AS c1 LEFT JOIN (SELECT id,name FROM category GROUP BY name HAVING COUNT(*) > 1) AS c2 ON c1.name = c2.name
WHERE c1.id != c2.id;
– 用IN、NOT IN也可以實現
```
SELECT * FROM category AS c1
WHERE c1.name IN
(SELECT name FROM category GROUP BY name HAVING COUNT(*) > 1)
AND c1.id NOT IN
(SELECT MIN(id) FROM category GROUP BY name HAVING COUNT(*) > 1)
```
實現真正的刪除
DELETE FROM category
WHERE name IN
(SELECT name FROM (SELECT name FROM category GROUP BY name HAVING COUNT(*) > 1) AS t1)
AND id NOT IN
(SELECT id FROM (SELECT MIN(id) AS id FROM category GROUP BY name HAVING COUNT(*) > 1) AS t2);
// 創建省份表
CREATE TABLE province(
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(64)
)
// 填充省份表中的數據
// 如何填充?
// 學生表中的省份去重,然後插入到省份表
INSERT INTO province(name) SELECT DISTINCT province FROM student;
// 多表聯合更新: 更新省份,把student表中的province從漢字更新爲對應省份的id
UPDATE student INNER JOIN province ON student.province = province.name
SET student.province = province.id;
// 一般來說,外鍵的名字爲當前列的名字加外檢表的列名,中間用下劃線鏈接,比如student表中province應該改成province_id,以及類型改爲int
ALTER TABLE student CHANGE COLUMN province province_id INT NOT NULL AFTER city;
4.4.2 實戰操作:修改student中的city,所有對應的city都會變
//創建city表
CREATE TABLE city(
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(64) NOT NULL
);
// 填充city表的數據,從student中篩選出city,然後去重(取city的唯一值),插入到city表中
INSERT INTO city(name) SELECT DISTINCT city FROM student;
// 將student表中的city改爲對應city表中的id
UPDATE student INNER JOIN city ON student.city = city.name
SET student.city = city.id;
// 更新city列名稱爲city_id,類型爲int
ALTER TABLE student CHANGE COLUMN city city_id INT NOT NULL AFTER age;
4.4.3 要掌握的語法
將A表a字段插入到B表b字段
關鍵字
DISTINCT 唯一的,不重複的
INSERT TO B(b) SELECT DISTINCT a FROM A;
更新表的數據
UPDTE 表名
SET 字段=值;
更新表某一列的設計,比如city列,名字改爲city_id,類型改爲int
ALTER TABLE 表名 CHANGE COLUMN 老列名 新列名 [INT NOT NULL] AFTER 放在哪列後面的列名
//舉例:
// 更新city列名稱爲city_id,類型爲int
ALTER TABLE student CHANGE COLUMN city city_id INT NOT NULL AFTER age;