-1

他のフィールドに依存する自動インクリメント「カウンター」を取得する最良の方法は何ですか?.

このテーブルを想像してください

CUSTOMER - COUNTER
1 - 1
1 - 2
1 - 3
2 - 1
2 - 2

すべての顧客に追加するレコードごとに、カウンターのインクリメントが 1 必要です。

よろしく。

4

3 に答える 3

1

すべての顧客のカウンターを保持する追加のテーブルを作成します。

CREATE TABLE customer_counter
(
  customer_id  INTEGER NOT NULL,
  counter      INTEGER NOT NULL,

  PRIMARY KEY (customer_id)
)

特定の顧客の次のカウンター番号を取得するには、次の手順を使用します。

CREATE PROCEDURE get_customer_counter (customer_id INTEGER)
  RETURNS (counter INTEGER)
AS
BEGIN
  SELECT SUM(counter) FROM customer_counter
  WHERE customer_id = :customer_id
  INTO :counter;

  counter = COALESCE(:counter, 0);

  EXECUTE STATEMENT 
    'INSERT INTO customer_counter (customer_id, counter) ' ||
    'VALUES (' || :customer_id || ', 1)'
    WITH AUTONOMOUS TRANSACTION;
END

単一のレコードを更新する代わりに、合計を使用してデルタ値を挿入する方法を確認してください。したがって、デッドロックを防ぎます。

定期的に、デルタ レコードを合計値のあるレコードにマージして、カウンター テーブルをクリアする必要があります。

CREATE TRIGGER on_disconnect_database
  ACTIVE
  ON DISCONNECT
AS
  DECLARE VARIABLE sm          INTEGER;
  DECLARE VARIABLE cnt         INTEGER;
  DECLARE VARIABLE customer_id INTEGER;
BEGIN
  FOR
    SELECT customer_id, SUM(counter), COUNT(counter)
    FROM customer_counter
    GROUP BY customer_id
    INTO :customer_id, :sm, :cnt
  DO BEGIN
    IF (:cnt > 1) THEN
    BEGIN
      DELETE FROM customer_counter WHERE customer_id = :customer_id;
      INSERT INTO customer_counter (customer_id, counter)
        VALUES (:customer_id, :sm);
      WHEN ANY DO
      BEGIN
      END
    END
  END
END
于 2012-09-24T09:40:26.533 に答える
0

与えられたものについて正確に何を望んでいるのかを本当に伝えるのは難しいですが、各 X フィールドと Y サブフィールドをループしたり、カウンターなどに使用したりしたいと思います。

<?php
$x = array("customer1","customer2","customer3");
$y = array("name","address","phone");

$counter;

foreach($x as $eachX):
    $counter  = 1;
    foreach($y as $eachY):
        //do stuff here
        $counter++;
    endforeach;
endforeach;
?>
于 2012-09-24T08:59:11.247 に答える
0

このストアド プロシージャは問題ないと思います。

create procedure New_Procedure
returns (
o_customer integer,
o_counter integer)
as

declare variable v_oldcostomer integer;
begin

for select customer
 from customers
 order by 1
 into o_customer
 do begin
 if (v_oldcostomer is null or (v_oldcostomer is not null and v_oldcostomer <> o_customer) ) then
    o_counter = 0;

 o_counter = o_counter + 1;
 v_oldcostomer = o_customer;
 suspend;
 end
end
于 2012-09-24T09:33:37.797 に答える