2

私は CakePHP 1.2.11 で構築された Web アプリケーションを持っています。そしてmysqlデータベース。このアプリケーションには、users と actions という 2 つのテーブルがあります。ユーザーには多数のアクションがあり、user_id (ユーザー テーブルの ID) はアクション テーブルの外部キーです。id フィールドは自動インクリメント整数です。

CakePHP のドキュメントによると、id フィールドを Char(36) に設定すると、CakePHP は ID である各レコードに対して一意の文字列を生成できるようになります。

アプリケーションが実行中で、アプリケーションが既に持っているデータ レコードを失いたくありません。関連するテーブルを念頭に置いて、自動インクリメント整数 ID から char(36) に安全に移行できるかどうかを知る必要がありますか?

つまり、整数値を Cakephp が行う一意の文字列 ID に変更するにはどうすればよいでしょうか? 何かルールはありますか?この種の移行を自動化するツールがあれば、それを知っていただければ幸いです。

4

2 に答える 2

2

はい、varcharを使用するようにテーブルを変更するだけです。INT列はcharに変換できるため、元のIDが失われることはありません(古い通常のintと新しいuuidの両方が混在することになります)。VARCHAR(36)同様に保存する必要がある他のテーブルの外部キーにも変更が加えられていることを確認する必要があります。

次に、新しいコードをすぐにライブにプッシュしてください。そうしないと、varcharフィールドを自動インクリメントできないため、新しいレコードを作成できません。

最後に、新しいコードをプッシュした直後に、モデルキャッシュをクリアして、Cakeがまだそれをと見なさないようにしますINT

于 2012-11-07T14:57:28.520 に答える
0

切り替えてもよろしいですか?

正直なところ、UUID (CHAR(36)) に変更する正当な理由がない限り、自動インクリメント ID のままにしておくことをお勧めします。それぞれの利点を宣伝する人はたくさんいますが、自動インクリメント ID の方が高速であり、データの重複が心配なデータベースが複数ある場合を除き、自動 ID は問題ありません。(そして、それは単純な「スイッチ」ではありません)

それほど単純ではありません:

それでも UUID に切り替えたいと確信している場合は、自動化されたプロセスはありませんが、注意してください。フィールド タイプを切り替えるだけではありません。id フィールドを更新するスクリプトなどを作成する必要があります。関連するすべてのフィールド (つまり、「actions」テーブルの「user_id」は更新されません。など)。

その場合、方法は次のとおりです。

そのため、バックアップとしてデータベース (またはテーブル) の複製を作成します。次に、「id」フィールドの名前を「autoid」に変更し、別の id フィールド CHAR(36) を作成し、すべての UUID を入力するスクリプトを実行してから、関連する ID を入力する別のスクリプト (つまり、 「アクション」テーブル) を対応する UUID とともに。

UUID を生成する CakePHP コード:

CakePHP 1.2 で UUID を作成するためのリンクは次のとおりです: http://book.cakephp.org/1.2/en/view/826/uuid

于 2012-11-07T16:35:12.520 に答える