10

events私はすべての新しい情報がどこに行くかというテーブルを持っています。このテーブルは、ニュース フィードのすべてのクエリの参照として機能するため、そこからイベント アイテムが選択され、そのイベントに対応する情報が正しいテーブルから取得されます。

さて、ここに私の問題があります。私は別のテーブルのイベントの ID に対応するをE_IDイベント テーブルに持っています。テーブルごとに 500から 0 などで開始しました。明らかに、どのテーブルに最も多くのデータが含まれるかまだわからないので、そうしたくありません。をすぐに超えると思います。T_IDtracksS_IDstatusstatustracksstatustracks

event情報は、トリガーを使用してテーブルに挿入されます。その一例を次に示します。

BEGIN
INSERT INTO events (action, E_ID, ID)
VALUES ('has some news.', NEW.S_ID, NEW.ID);
END

それは彼のステータステーブル用です。

NEW.S_ID!= がE_ID現在入っていることを確認するために作成できるそのトリガーへの追加はありますeventsか?それに応じて変更する場合S_ID

または、 がの値にインクリメントされないS_IDように、 を自動インクリメントするときにイベントを参照するために使用できる何らかのキーがありますか。S_IDE_ID

これらは私の考えです。後者のソリューションの方が良いと思いますが、それが可能かどうかは疑問ですが、別の参照テーブルが必要になり、複雑すぎるでしょう。

4

3 に答える 3

15

テーブル全体で一意の ID を要求することは非常にまれですが、それを行うソリューションを次に示します。

/* Create a single table to store unique IDs */
CREATE TABLE object_ids (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    object_type ENUM('event', ...) NOT NULL
) ENGINE=InnoDB;

/* Independent object tables do not auto-increment, and have a FK to the object_ids table */
CREATE TABLE events (
    id INT UNSIGNED NOT NULL PRIMARY KEY,
    ...
    CONSTRAINT FOREIGN KEY (id) REFERENCES object_ids (id)
) ENGINE=InnoDB;

/* When creating a new record, first insert your object type into the object_ids table */
INSERT INTO object_ids(object_type) VALUES ('event');
/* Then, get the auto-increment id. */
SET @id = LAST_INSERT_ID();
/* And finally, create your object record. */
INSERT INTO events (id, ...) VALUES (@id, ...);

明らかに、events他のテーブルのテーブルの構造を複製します。

于 2013-06-06T12:20:48.540 に答える
3

Universal Unique Identifier (UUID) を使用することもできます。

UUID は、空間と時間においてグローバルに一意な番号として設計されています。UUID() への 2 つの呼び出しは、互いに接続されていない 2 つの別個のコンピューターでこれらの呼び出しが実行された場合でも、2 つの異なる値を生成することが期待されます。

詳細については、マニュアルを参照してください。

短いバージョンもあります。

于 2013-06-06T13:17:19.953 に答える