0

データベースに日付をテキストで表すテーブル(つまり「2008-11-09」)があり、それらをUNIXタイムスタンプに置き換えたいと思います。ただし、MySQLが単独で変換を実行できるとは思わないので、変換を実行するための小さなスクリプトを作成したいと思います。私がそれを行うと考える方法は、テーブル内のすべてのレコードを取得し、それらを反復処理し、データベースレコードを更新することです。ただし、主キーがないと、更新する必要のある正確なレコードを簡単に取得できません。

UPDATEを実行するときにレコードを参照できるように、SELECT中にMySQLにレコードに一時IDを割り当てる方法はありますか?

4

4 に答える 4

5

これではいけませんか?

UPDATE
  MyTable
SET
  MyTimeStamp = UNIX_TIMESTAMP(MyDateTime);
于 2008-11-09T18:10:52.330 に答える
1

何らかの理由で反復する必要がある場合 (他の回答は反復しない状況をカバーしています)、それを行う 2 つの方法を考えることができます (これらは MySQL 固有ではありません)。

  1. 自動割り当て番号であるテーブルに列を追加します。それを更新の PK として使用し、後で列を削除します (または、将来の使用のためにそのままにしておきます)。

  2. PK が定義されていないテーブルでは、完全に重複する行がない限り、行全体を複合 PK として使用できます。行のすべての列を特徴として使用してください。つまり、テーブルに「name」、「address」、「updated」の 3 つの列がある場合は、次のようにします。

    UPDATE mytable SET updated = [timestamp value] WHERE name = [名前] AND address = [アドレス] AND timestamp = [古いタイムスタンプ]

多くのデータ アクセス フレームワークは、この正確な戦略を使用して、オプティミスティック コンカレンシーを実装しています。

于 2008-11-09T18:10:07.823 に答える
1

いいえ、単一の update ステートメントでこれを実行できるはずです。すべての日付が yyyy-mm-dd であり、DATETIME ではなく何らかのテキスト列に格納されている場合は、データを移動するだけです。SQL は次のようになります。

ALTER TABLE t ADD COLUMN dates DATETIME;
UPDATE t set t.dates=t.olddate;

MySQL はテーブル内の各行をスキャンできるため、これは PK に依存するべきではありません。PK が問題になるのは、単一の行を更新する必要がある場合のみですが、その行は一意ではない可能性があります。

于 2008-11-09T18:10:27.963 に答える
1

MySQL ユーザー変数機能の使用中に値を生成できますSELECTが、これらの値は行を参照しません。それらは結果セットの一時的な部分のみです。UPDATEステートメントでは使用できません。

SET @v := 0;
SELECT @v:=@v+1, * FROM mytable;

これが私が問題を解決する方法です。いずれにせよ、UNIX タイムスタンプ用に別の列を作成する必要があるため、最初に追加できます。次に、古い日時列の値を UNIX タイムスタンプに変換し、それを新しい列に配置します。次に、古いテキストの日時列を削除します。

ALTER TABLE mytable ADD COLUMN unix_timestamp INT UNSIGNED NOT NULL DEFAULT 0;

UPDATE mytable
SET unix_timestamp = UNIX_TIMESTAMP( STR_TO_DATE( text_timestamp, '%Y-%m-%d' ) );

ALTER TABLE mytable DROP COLUMN text_timestamp;

もちろん、古い列を削除する前に、変換が正しく行われたことを確認する必要があります!

UNIX_TIMESTAMP()て、STR_TO_DATE()

于 2008-11-09T18:14:43.867 に答える