MySQL ֶΣУĔ(sh)(j)͡L(zhng)Ȼ?q)һ?xing)ҊĔ(sh)(j)(k)So(h)DDLʹ `ALTER TABLE` Z(y)䣬wZ(y)(j)ͬ
ľ棺˲Ӱ푬F(xin)Д(sh)(j)ia(chn)h(hun)(zh)ǰ(w)Âݲu(png)Ӱ
MySQL ṩ˃ɷNҪZ(y)(li)ֶmڲͬ(chng)
1. `MODIFY COLUMN` - (ͺ͌)
(dng)ֻĔ(sh)(j)͡L(zhng)Ȼ?q)ԣ?`NOT NULL``DEFAULT`׃ֶr(sh)ʹôZ(y)@õķʽ
MODIFY COLUMN column_name new_datatype [sl];
2. `CHANGE COLUMN` - (ֶͬr(sh)ֶ)
Z(y)ֶͬr(sh)ֶ͔(sh)(j)/ʹ㲻ֶҲ회ԭֶֶ
CHANGE COLUMN old_column_name new_column_name new_datatype [sl];
* `new_datatype`µĿ(bio)(sh)(j)ͣ `VARCHAR(255)`, `INT`, `DECIMAL(10,2)`
* `sl`xµļs `NOT NULL`, `DEFAULT value`, `COMMENT 'ע'` ȡ
O(sh)҂һ(g) `users` ʼY(ji)(gu)£
1. ֶΔ(sh)(j)ͺL(zhng) (ʹ `MODIFY`)
`username` ֶε `VARCHAR(50)` Ğ `VARCHAR(100)`ַǿռs
MODIFY COLUMN username VARCHAR(100) NOT NULL;
2. ֶεĬJ(rn)ֵS NULL (ʹ `MODIFY`)
`age` ֶθĞS `NULL` ֵO(sh)ĬJ(rn)ֵ `18`
MODIFY COLUMN age TINYINT NULL DEFAULT 18;
3. ͬr(sh)ֶ͔(sh)(j) (ʹ `CHANGE`)
`signup_date` ֶθ `registration_date`䔵(sh)(j)͏ `DATETIME` Ğ `TIMESTAMP`
CHANGE COLUMN signup_date registration_date TIMESTAMP;
-- ֶֻ 'age' 'user_age'ͱֲ׃
CHANGE COLUMN age user_age TINYINT;
ֱa(chn)h(hun)ΣU(xin)Ո(qng)(yn)ѭ̣
@ҪIJEڈ(zh)κ DDL ǰ(w)Ĕ(sh)(j)(k)Ŀ(bio)
mysqldump -u username -p database_name users > backup_users.sql
2. zF(xin)бY(ji)(gu)͔(sh)(j)
ʹ `DESCRIBE` `SELECT` 鿴(dng)ǰY(ji)(gu)͔(sh)(j)ӱu(png)ĵĿ
DESCRIBE users; -- 鿴Y(ji)(gu)
SELECT * FROM users LIMIT 5; -- 鿴ӱ(sh)(j)
ڜy(c)ԇh(hun)Ĕ(sh)(j)(k)ψ(zh)ͬIJ(yn)C
* (sh)(j)D(zhun)QǷA(y)ڣПo(w)(bo)e(cu)?ci)ࣩ?/span>
(du)ڴֶβܕ(hu)iӰ(w)ھW(wng)վ(yng)͵ĕr(sh)(zh)
ALTER TABLE users MODIFY COLUMN username VARCHAR(150) NOT NULL;
ɺzY(ji)(gu)_J(rn)ѳɹәz锵(sh)(j)
DESCRIBE users; -- _J(rn)½Y(ji)(gu)
SELECT username FROM users LIMIT 5; -- _J(rn)(sh)(j)
1. (sh)(j)?ci)?(Data Truncation)
L(fng)U(xin)ֶL(zhng)ȸ `VARCHAR(100)` Ğ `VARCHAR(10)`ԭД(sh)(j)L(zhng)ȳ^ 10 (g)ַ(hu)ʧ(sh)(j)?ci)Gʧ
SELECT * FROM users WHERE LENGTH(username) > 10;
L(fng)U(xin)MySQL o(w)F(xin)Д(sh)(j)D(zhun)Qµͣ猢ĸַ `'abc123'` D(zhun)Q(sh) `INT`
-- zǷusernameֶεֵD(zhun)Q(sh)
SELECT * FROM users WHERE username NOT REGEXP '^[0-9]+$';
L(fng)U(xin)IֶΔ(sh)(j)ͷdz(f)sֱӲ(hu)ʧ
ALTER TABLE child_table DROP FOREIGN KEY fk_name;
ALTER TABLE child_table MODIFY COLUMN user_id BIGINT UNSIGNED;
ALTER TABLE parent_table MODIFY COLUMN id BIGINT UNSIGNED;
ALTER TABLE child_table ADD CONSTRAINT fk_name FOREIGN KEY (user_id) REFERENCES parent_table(id);
L(fng)U(xin)ֱĴ(hu)(do)L(zhng)r(sh)gi(w)
* ʹ Online DDL (MySQL 5.6+)ʹ `ALGORITHM` `LOCK` ӾLԇpir(sh)g
ALTER TABLE users MODIFY COLUMN metadata JSON, ALGORITHM=INPLACE, LOCK=NONE;
* `ALGORITHM=INPLACE`MM(jn)ھ
ע⣺Ķ֧ `INPLACE` 㷨磬`VARCHAR` pL(zhng)ȾͲ֧֣
* ʹõߣ pt-online-schema-change (Percona Toolkit)ڎirɽY(ji)(gu)׃a(chn)h(hun)׃x
| ֻ/ | `ALTER TABLE ... MODIFY COLUMN ...` | |
| ֶ | `ALTER TABLE ... CHANGE COLUMN ...` | ָfֶ |
ь(sh)`һԒY(ji)ǰ(w)ڜy(c)ԇh(hun)(yn)Ca(chn)h(hun)(yng)xͷڣ(du)ڴ(w)ʹھDDL?q)I(y)ߣpt-oscԱL(zhng)r(sh)gi
ݵMYSQLݹɶr(sh)ݡMYSQL(do)(do)ɱBLINUXMYSQL(jin)αԴ߹Ч