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 へのインストールおしえてください。