Mysql

如何刪除所有預設值並允許表的所有列為 NULL?

  • March 13, 2019

我正在編寫一個 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 COLUMNDROP 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)

請參閱主鍵。它有兩列:startnrslutttid

現在,如果我在那個表上執行我的程式碼,我會得到這個列表

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 更改MODIFYDROP

MODIFY COLUMN startnr DEFAULT NULL,DROP COLUMN slutttid

您將使用這種程式碼來生成所需的子句

引用自:https://dba.stackexchange.com/questions/84725