如何刪除所有預設值並允許表的所有列為 NULL?
我正在編寫一個 PHP 腳本來修改表的主鍵 (PK)。我目前的程式碼是:
$q = "SHOW KEYS FROM $db.$table WHERE Key_name='PRIMARY';"; $keys = Query ( $q); if ( $keys) { $q = "ALTER TABLE $db.$table DROP PRIMARY KEY, ADD PRIMARY KEY ($keyQ);"; $res = Query ( $q); } else { $q = "ALTER TABLE $db.$table ADD PRIMARY KEY ($keyQ);"; $res = Query ( $q); }
這主要適用於我需要的東西。唯一的問題是,如果我將一個欄位作為 PK 刪除,它會保留 NULL=‘No’ 和 DEFAULT=0 屬性而不是 PK。
由於我稍後將定義 PK,而且我通常不需要 not null 和 default 約束,我想清除所有非 null 值和預設值。然後我可以繼續定義主鍵並知道主鍵是唯一具有預設值而不是 NULL 約束的列。
有沒有辦法用 MySQL 做到這一點?我可以用 PHP 做到這一點,但它可能會做更多的工作並且會不那麼優雅。
您可能需要INFORMATION_SCHEMA.KEY_COLUMN_USAGE
您必鬚髮出此查詢
SELECT column_name FROM information_schema.key_column_usage WHERE table_schema='$db' AND table_name='$table' AND constraint_name='PRIMARY';
這將檢索
PRIMARY KEY
.然後,您可以使此查詢
ALTER TABLE
為您生成子句,如下所示:SET group_concat_max_len = 1048576; SELECT GROUP_CONCAT(CONCAT('MODIFY COLUMN ',column_name,' DEFAULT NULL')) FROM information_schema.key_column_usage WHERE table_schema='$db' AND table_name='$table' AND constraint_name='PRIMARY';
這將生成一個逗號分隔的
MODIFY COLUMN
子句列表,您需要在刪除PRIMARY KEY
. 如果要刪除這些列中的任何一個,則必須更改MODIFY COLUMN
為DROP COLUMN
需要刪除的列。試一試 !!!
更新 2014-12-09 14:00 EST
你的評論
我試圖了解這是如何工作的。GROUP_CONCAT(CONCAT(‘MODIFY COLUMN ‘,column_name,’ DEFAULT NULL’)) 讓我特別困惑。此查詢中的 column_name 來自哪裡?我嘗試在 MySQL 中按原樣執行它,但沒有得到任何結果
為了讓您大致了解查詢如何為您提供幫助,這是我筆記型電腦上 MySQL 中的一個表
mysql> show create table weird.vinner\G *************************** 1. row *************************** Table: vinner Create Table: CREATE TABLE `vinner` ( `startnr` int(11) NOT NULL, `alder` varchar(25) NOT NULL, `kjonn` varchar(25) NOT NULL, `ovelseid` varchar(25) NOT NULL, `slutttid` int(11) NOT NULL, PRIMARY KEY (`startnr`,`slutttid`), KEY `slutttid` (`slutttid`), CONSTRAINT `vinner_ibfk_1` FOREIGN KEY (`slutttid`) REFERENCES `passering` (`slutttid`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec)
請參閱主鍵。它有兩列:
startnr
和slutttid
。現在,如果我在那個表上執行我的程式碼,我會得到這個列表
mysql> SET group_concat_max_len = 1048576; Query OK, 0 rows affected (0.00 sec) mysql> SELECT GROUP_CONCAT(CONCAT('MODIFY COLUMN ',column_name,' DEFAULT NULL')) -> FROM information_schema.key_column_usage -> WHERE table_schema='weird' -> AND table_name='vinner' -> AND constraint_name='PRIMARY'; +------------------------------------------------------------------------+ | GROUP_CONCAT(CONCAT('MODIFY COLUMN ',column_name,' DEFAULT NULL')) | +------------------------------------------------------------------------+ | MODIFY COLUMN startnr DEFAULT NULL,MODIFY COLUMN slutttid DEFAULT NULL | +------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql>
輸出為兩列創建一個 MODIFY COLUMN 子句。
如果您要刪除 sluttid 列,您將使用 PHP 更改
MODIFY
為DROP
MODIFY COLUMN startnr DEFAULT NULL,DROP COLUMN slutttid
您將使用這種程式碼來生成所需的子句