列を変更してデフォルト値を変更するにはどうすればよいですか?


189

列のデータ型を変更しようとして新しいデフォルト値を設定しているときに、次のエラーが発生しました。

ALTER TABLE foobar_data ALTER COLUMN col VARCHAR(255) NOT NULL SET DEFAULT '{}';

エラー1064(42000):SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、1行目の 'VARCHAR(255)NOT NULL SET DEFAULT' {} ''の近くで使用する正しい構文を確認してください


DEFAULTの前にSETが必要だとは思わない
ジョナスT

回答:


273
ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';

同じことを行う2番目の可能性(juergen_dのおかげ):

ALTER TABLE foobar_data CHANGE COLUMN col col VARCHAR(255) NOT NULL DEFAULT '{}';

9
columnオプションです。ALTER TABLE foobar_data MODIFY col VARCHAR(255) NOT NULL DEFAULT '{}';またはALTER TABLE foobar_data CHANGE col col VARCHAR(255) NOT NULL DEFAULT '{}';を使用するだけで、結果は同じになります。
kapad 2013年

1
これは、OPが要求していたデフォルトの文字列です。行を挿入するときにこの列に値を指定しない場合、値はになり{}ます。
fancyPants 2018

1
2つcolのsを隣同士に書くことは正しいですか?(このようにcol col
Shafizadeh

4
@Shafizadehはい、そうです。これにより、列の名前を変更できます。1つ目は元の名前、2つ目は新しい名前です。
fancyPants 2018

3
DEFAULT値のみを変更する必要がある場合は、これを使用しないでください。これにより、テーブルのすべての行が処理されます(巨大なテーブルでは非常に長くなります)。代わりALTER TABLE <table_name> ALTER COLUMN <column_name> SET DEFAULT <value>にインスタントです。
ドルメン

114

補足として、デフォルトを設定するだけの場合は、ALTER .. SET構文を使用できることを確認してください。そこに他のすべてのものを入れないでください。残りの列定義を配置する場合は、受け入れられた回答に従って、MODIFYまたはCHANGE構文を使用します。

とにかく、列のデフォルトを設定するためのALTER構文(これは私がここに来たときに探していたものなので):

ALTER TABLE table_name ALTER COLUMN column_name SET DEFAULT 'literal';

'リテラル'は数字でもかまいません(例...SET DEFAULT 0)。私はそれを試したことはありません...SET DEFAULT CURRENT_TIMESTAMPが、どうしてですか?


5
また、引用されている場合、current_timestampが機能していませんでした。私は次のように使用していた:ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP NOT NULL DEFAULT current_timestamp;
Nereis

7
+1正解です。これにより、列のタイプやその他の変更されないものを指定する必要がなくなります。
user2342558 2017

2
これは、DEFAULT値のみを変更する効率的な答えです。
ドルメン

1
デフォルト値を挿入時間にしたい場合は、NOW()またはcurrent_timestamp()@Malaise @Nereis
BlueCacti

16

すでに作成されている列にデフォルト値を追加する場合、これは私にとってはうまくいきます:

ALTER TABLE Persons
ALTER credit SET DEFAULT 0.0';

2
既存のフィールド仕様をコピーする必要がないため、これが最良の答えです。
rjh

4

DEFAULT CURRENT_TIMESTAMPの場合:

ALTER TABLE tablename
 CHANGE COLUMN columnname1 columname1 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
 CHANGE COLUMN columnname2 columname2 DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

二重列名の宣言に注意してください

DEFAULT CURRENT_TIMESTAMPを削除しています:

ALTER TABLE tablename
 ALTER COLUMN columnname1 DROP DEFAULT,
 ALTER COLUMN columnname2 DROPT DEFAULT;

なぜ列名が二重になるのですか?
MKJ 2018

2
ALTER TABLE tablename CHANGE COLUMN oldColName newColName columnDefinitions
Leonard Lepadatu

1

承認された回答は適切に機能します。

NULL値無効な使用エラーの場合、NULL値で、その列のすべてのNULL値をデフォルト値更新してから、変更を試みてください。

UPDATE foobar_data SET col = '{}' WHERE col IS NULL;

ALTER TABLE foobar_data MODIFY COLUMN col VARCHAR(255) NOT NULL DEFAULT '{}';

必要なもの。ありがとう
arslion

0

上記が機能しない場合(つまり、新しいSQLまたはAzureを使用している場合))、次のことを試してください。

1)既存の列制約(存在する場合)を削除します。

ALTER TABLE [table_name] DROP CONSTRAINT DF_my_constraint

2)新しいものを作成します。

ALTER TABLE [table_name] ADD CONSTRAINT DF_my_constraint  DEFAULT getdate() FOR column_name;

0

これを試して

ALTER TABLE `table_name` CHANGE `column_name` `column_name` data_type  NULL DEFAULT '';

このような

ALTER TABLE `drivers_meta` CHANGE `driving_license` `driving_license` VARCHAR(30) NULL DEFAULT '';
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.