[前][次][番号順一覧][スレッド一覧]

mysql:1798

From: とみたまさひろ <とみたまさひろ <tommy@xxxxxxxxxx>>
Date: Wed, 22 Mar 2000 13:25:35 +0900
Subject: [mysql 01798] Re: 質問「順序」を作るには?

とみたです。

At Wed, 22 Mar 2000 12:37:27 +0900,
さかい <s.sakai@xxxxxxxxxx> wrote:

> 少々、機能的に違うようです。

# やはり外したか…(^^;

> ORACLE では以下のような使い方をします。
> 
> #  Create Sequence COUNT;
> 
> これでCOUNT と言う名前のオブジェクトができます。
> このCOUNT はデフォルトで 1 の値を持ち COUNT.nextval で
> 1ずつ増加しその値が参照できます。たとえばCOUNT = 1 のとき
> 
> # INSERT INTO テーブルA VALUE ( COUNT.nextval , '値1','値2');
> 
> これでテーブルAの最初のフィールドに 2  が書き込まれます。
> 何に使うかといいますと、複数のテーブルである一意の受序を保つ為に
> 便利なんです。次に、
> 
> # INSERT INTO テーブルB VALUE ( COUNT.nextval , '値3','値4');
> 
> と書くと、テーブルBの最初のフィールドに 3 が書き込まれます。
> 
> なにか良い方法はないでしょうか


MySQL ではテーブル以外にサーバ側にオブジェクトを置くのは難しいので、カウ
ンタはテーブルに置くことにしましょう。

	mysql> create table COUNTER (N int);
	mysql> insert into COUNTER values (0);

で、こんな風にして、INSERT & カウントアップを行ないます。

	mysql> lock tables COUNTER write;
	mysql> update COUNTER set N=N+1;
	mysql> insert into テーブルA select N, '値1', '値2' from COUNTER;
	mysql> unclock tables;

こんなんでどうでしょう?

ほかのプログラムから同時に使用されることを考えて、一応ロックしてます。
INSERT が頻繁なシステムだと LOCK でちょっと遅くなるかもしれません。

MySQL 3.23.6 以降(だったかな?)だと、ユーザ変数を使えば LOCK しなくても
できると思います。

	mysql> update COUNTER set N=(@n:=N+1);
	mysql> insert into テーブルA values (@n, '値1', '値2');

update はアトミックに実行されるし、@n は接続毎に保持されるので、他の接続
から同時にアクセスがあっても大丈夫です… よね? イマイチ自信なし (^^; 

--
とみたまさひろ <tommy@xxxxxxxxxx>

[前][次][番号順一覧][スレッド一覧]

      1795 2000-03-22 11:22 [さかい <s.sakai@xxxx] 質問「順序」を作るには?                
      1796 2000-03-22 11:36 ┗[とみたまさひろ <tomm]                                       
      1797 2000-03-22 12:37  ┗[さかい <s.sakai@xxxx]                                     
->    1798 2000-03-22 13:25   ┗[とみたまさひろ <tomm]                                   
      1799 2000-03-22 14:12    ┗[さかい <s.sakai@xxxx]                                 
      1800 2000-03-24 11:16     ┗[Shigeru Nagai <w9617] RAQ 2 へのインストールおしえてください。