2011-12-15 11 views
0

列挙型を持つものをリンクテーブルのIDに変更します。列挙型からリンクテーブルへの変更

どうすればいいですか?

当社の現在の列挙名:strat
我々の新しいリンク名:stratid

私が考えていた何の線に沿って何かだった:

UPDATE table_name 
SET stratid = (SELECT id FROM link_table WHERE stratname = table_name.strat); 

私ははまだリンクテーブルを作成していない持っています、今はすべての理論です。

上記は機能しますか?
列挙型からリンクテーブルに転送するために変更する必要があるものはありますか?

答えて

0

あなた必要があなたのlink_table.id sはtable_name.stratオプションが定義されていることを順番に厳密に装着されていることをトリプルを確認するよりも、他の更新を行うためのない落とし穴。例えば

stratenum('FOO', 'BAR')であれば、その後、linked_tableid == 1を持つレコードは「FOO」のレコードでなければなりません。

その後、おそらくstratidカラムをNON NULLにしたいと思うでしょう。これは以前の配置と厳密には同じではありませんが、おそらくあなたが望むものに近いでしょう。私はわからない、しかし

insert into link_table 
select distinct strat from table_name order by strat; 

+0

「厳密な順序で」とはどういう意味ですか?同じIDを使用して複数のレコードが存在します。 – Neal

+0

@Neal:編集を行いました。私は、リンクされたテーブルの各値のIDが、対応するenum要素の整数値と等しいことを望んでいる(強すぎる必要がある)ことを意味しました。 – Jon

+0

列挙型の値は** not **の整数です。 – Neal

0

はい、最初のリンクテーブルを作成し、
がユニークとしてstratnameを設定し、

に挿入link_tableのための怠惰なソリューションを自動インクリメントのIDを使用しますすべての定義済み列挙型が使用されています。

また、列挙型のサイズを知らないうちに、
手動で挿入することはお勧めできません。

あなたが列挙型を見れば...

enum('...', '...', ...) <-- is just a comma separated value 

ので、ここCSVを取得するクエリです: -

select column_type from information_schema.columns 
where schema_name="table_name" and column_name = "strat"; 

あなたはlink_table挿入を行うには、プログラミング言語と組み合わせることができます。

最後に、UPDATEクエリがあまり最適化されていないため、INNER JOINを使用するように切り替えることができます。
しかし、私は一度だけの仕事だと思います。

関連する問題