1

主キーが ID としての unsigned big int と、YYYY-MM-DD HH-MM-SS として設定された datetime 変数の組み合わせであるこのテーブルがあります。

私は次のコメントからアイデアを得ました: MySQL: Using DATETIME as primary key

私が抱えている問題は、同じ ID で日時が異なる新しいレコードを挿入しようとすると、重複 ID の主キー制約に違反しているというエラーが表示されることです。

私の推測では、MySQL は文字列比較を行っているため、datetime データ型の YYYY-MM-DD 部分のみを比較していると思いますが、よくわかりません...それは単なる私の理論です。

主キーの一部としてdatetimeを使用したことがある人が何らかの洞察を持っていることを望んでいました.

明らかに最初のレコードが作成されていますが、同じ ID を持つ 2 番目のレコードが作成されていないため、php コードは正しいです。

SQLコードを表示しないようにしていましたが、ここにあります

    CREATE TABLE userPosts(
    postID      SERIAL          NOT NULL,
    username    varchar(21)     NOT NULL,
    time        datetime        NOT NULL,
    text        varchar(500),
    type        varchar(1)      NOT NULL    CHECK(type='t' OR type='f' OR type='u' OR type='b' OR type='c'),
    -- visits       integer         NOT NULL    DEFAULT 0,

    CONSTRAINT FK_users_userPosts   FOREIGN KEY(username)   REFERENCES users(username) ON DELETE CASCADE,
    CONSTRAINT PK_userPosts_username_postID_time    PRIMARY KEY(postID,time)
    );

このテーブルが ISA テーブルとして記述される階層モデルを使用しています。

うわー、私はIDをUNIQUEであると信じているSERIALデータ型として割り当てたからだと思います... データベースがそれを行うのではなく、IDを自動インクリメントするようにphpを再実装する必要があります。

コードを再実装し、皆さんに投稿し続けます。

4

3 に答える 3

0

あなたが説明したエラーは、日付が主キーの一部ではないことを意味します。

テーブルの作成方法と現在のスキーマをチェックして、それが正しく行われたかどうかを確認する必要があります。

MySQL が YYYY MM DD のみを比較する理由はありません。何でも比較します。疑問がある場合は、日付を Unix タイムスタンプとして保存し、出力用に PhP で再加工する方が簡単な場合があります。考えてみてください。

于 2013-08-23T05:29:48.090 に答える