Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Remote » SQL Remote 复制设计 » SQL Remote 复制设计和设置 » 重复主键错误 » 使用主键池

 

使用键池中的主键

当销售代表向 Customers 表添加新客户时,使用一个存储过程获取要插入的主键值。此示例使用一个存储过程来提供主键值,使用另一个存储过程来执行插入操作。

♦  使用主键 (SQL)
  1. 创建一个在远程数据库中运行的过程以从主键池表中获取主键。

    例如,NewKey 过程提供键池中的一个整数值,并将该值从池中删除。

    CREATE PROCEDURE NewKey(
          IN @table_name VARCHAR(40),
          OUT @value INTEGER )
    BEGIN
       DECLARE NumValues INTEGER;
       
       SELECT COUNT(*), MIN(value)
       INTO NumValues, @value
             FROM KeyPool
             WHERE table_name = @table_name
             AND location = CURRENT PUBLISHER;
       IF NumValues > 1 THEN
          DELETE FROM KeyPool
          WHERE table_name = @table_name
          AND value = @value;
       ELSE
       // Never take the last value, because
       // ReplenishPool will not work.
       // The key pool should be kept large enough
       // that this never happens.
          SET @value = NULL;
       END IF;
    END;

    NewKey 过程利用这样一个事实:销售代表标识符是远程数据库的 CURRENT PUBLISHER。

  2. 创建一个在远程数据库中运行的过程以在预订表中插入新行。

    例如,NewCustomers 过程将新客户插入到表中,同时使用通过 NewKey 获取的值来构造主键。

    CREATE PROCEDURE NewCustomers(
          IN customer_name CHAR( 40 ) )
    BEGIN
       DECLARE new_cust_key INTEGER ;
       CALL NewKey( 'Customers', new_cust_key );
       INSERT
       INTO Customers (
          cust_key,
          name,
          location
          )
       VALUES (
          'Customers ' ||
          CONVERT (CHAR(3), new_cust_key),
          customer_name,
          CURRENT PUBLISHER
          );
    );
    END

    可通过这种方式增强此过程:对通过 NewKey 获取的 new_cust_key 值进行测试以检查该值是否为 NULL,如果是 NULL,则禁止插入。