4

データベースのすべてのテーブルに一意の主キーを設定する方法は?
たとえば、別のテーブルの主キーを繰り返したくありません。

table A:
----------
id | name
----------
1  | aaa
3  | bbb
5  | ccc

table B:
-------------
id | surname
-------------
7  | ddd
2  | eee
9  | fff

table C:
-------------
id | nickname
-------------
4  | ggg
6  | hhh
8  | iii

すべてidありprimary keyますauto_increment。すべてのデータは動的に入力されます。私は で使用MYSQLしていPHPMYADMINます。

4

4 に答える 4

5

ID_Tableデフォルト値 0 で呼び出される数値列を 1 つだけ持つ、という名前のスキーマに新しいテーブルを追加できます。スキーマcurrent_idの他のテーブルに新しい行を追加する場合は、ID_Table.current_id + 1新しい ID 値として返されるID_Table で選択を呼び出す必要があります。 . 次に、ID_Table を更新する必要があります

Update ID_Tableset ID_Table.current_id = ID_Table.current_id + 1 

このGetNewId関数は ID_Table をロックすることで実装できます ID_Table
を更新して NewID を
返します

このようなもの(私はOracle構文を使用しました)

create table ID_Table(
   current_id number
); 

Insert into ID_Table values(0);

CREATE OR REPLACE Function GetNewId RETURN number is
  new_id    ID_Table.current_id%type;
  row_count number;
begin
  select nvl(ID_Table.current_id, 0) + 1
    INTO new_id
    FROM ID_Table
     for update;
  update ID_Table set ID_Table.Current_Id = new_id;
  commit;

  RETURN new_id;
end GetNewId;
于 2013-05-11T18:17:12.663 に答える
1

3 つのテーブルすべてから最大値を取得IDし、それを挿入クエリに追加できます。auto_incrementただし、属性を削除する必要があります。

INSERT INTO TableA
SELECT MAX(ID)+1, 'jjj'
  FROM
      (SELECT MAX(ID) AS ID FROM TableA
       UNION
       SELECT MAX(ID) AS ID FROM TableB
       UNION
       SELECT MAX(ID) AS ID FROM TableC
      ) A;

このSQLFiddleを参照してください

于 2013-05-11T07:19:51.123 に答える
1

テーブルに関係なく、挿入された行ごとに ID ジェネレーターと同じシーケンスを使用します。フィールドのIDジェネレーターとしてシーケンスに名前を付けることができるDBを使用していると仮定します。

これは、MySQL で必要なことを行うように見えます: http://devzone.zend.com/1786/mysql-sequence-generator/

于 2013-05-11T06:57:59.597 に答える
0

シーケンスの使用を見てください。使用しているDBがわかりません。Postgresql と Oracle には、テーブル間で共有できるシーケンスがあります。

于 2013-05-11T06:58:08.360 に答える