4

@@ system_time_zoneを、既存のテーブルに追加しようとしている列のデフォルト値として定義しようとしています。例えば

ALTER TABLE T1 ADD COLUMN TIME_ZONE CHAR(64) NOT NULL DEFAULT @@system_time_zone;

これにより、MySQL構文エラーが発生します。@@system_time_zoneを一重引用符で囲んでみました。私は今、これを次のように2つに分割しています。

ALTER TABLE T1 ADD COLUMN TIME_ZONE CHAR(64) NOT NULL;

UPTATE T1 SET TIME_ZONE=@@system_time_zone;

これは機能しますが、これが理想的なソリューションではないことは明らかです。Google / StackOverFlowを検索しようとしましたが、役に立ちませんでした。これを達成できる正しい構文があるかどうか、またはこれを達成できる他の代替案があるかどうかを誰かに知らせてもらえますか?

4

1 に答える 1

2

これはMySQLの制限です。

The DEFAULT value clause in a data type specification indicates a default value for a column. With one exception, the default value must be a constant; it cannot be a function or an expression

ただし@@、と@は、システム変数またはローカル変数の値を取得するために使用される式です。そして、それらは一定ではありません。それらは実行時に変更できます。

あなたのアプローチは問題ありませんが、本当にシステム変数を使用したい場合は、次のような動的SQLを使用できます。

set @q = concat('alter table t1 add column time_zone char(64) not null default ', quote(@@system_time_zone));

prepare stmt from @q;
execute stmt;
deallocate prepare stmt;

@lanzzのアドバイスによると:最後のコードブロック@@system_time_zoneでは、動的変数ではなく定数になります。また、将来タイムゾーンが変更される場合、この列のデフォルト値はそのまま残ります。

于 2012-10-23T13:04:10.153 に答える