7

ロード中に、データが重複していないことを確認する検証手順を作成しようとしています。Verticaはこれをネイティブにサポートしていません:

Verticaは、データがロードされたときではなく、クエリが実行されたときに制約違反をチェックします。ロードプロセスの一部として制約違反を検出するには、NO COMMITオプションを指定したCOPY(ページ667)ステートメントを使用します。データをコミットせずにロードすることにより、ANALYZE_CONSTRAINTS関数を使用してデータのロード後チェックを実行できます。関数が制約違反を検出した場合、コミットしていないため、ロードをロールバックできます。

問題は、これをプログラムで行う方法がわからないことです。ストアドプロシージャが必要だと思いますが、verticaのストアドプロシージャの構文/制限に精通していません。手伝ってくれますか?これが私が持っているものです:

-- Create a new table. "id" is auto-incremented and "name" must be unique
CREATE TABLE IF NOT EXISTS my_table (
id IDENTITY
, name varchar(50) UNIQUE NOT NULL
, type varchar(20)
, description varchar(200)
);

--Insert a record
begin; 
copy my_table from stdin
abort on error
NO COMMIT; -- this begins the load
name1|type1|description1 --this is the load
\. -- this closes the load
commit;

-- insert the duplicate record
begin; 
copy my_table from stdin
abort on error
NO COMMIT; -- this begins the load
name1|type1|description1 --this is the load
\. -- this closes the load
commit; -- Surprisingly, the load executes successfully! What's going on?!?!

-- Check constraints. We see that there is a failed constraints:
select analyze_constraints('my_table');

私の考えは、いくつかの条件付きロジックを実行することです。疑似コードは以下のとおりです。Verticaの準備を手伝ってもらえますか?

Begin
load data
if (select count(*) from (select analyze_constraints('my_table')) sub) == 0:
commit
else rollback
4

3 に答える 3

4
-- Start by Setting Vertica up to rollback and return an error code 
-- if an error is encountered.

\set ON_ERROR_STOP on

-- Load Data here (code omitted since you already have this)


-- Raise an Error condition by selecting 1/0 if any rows were rejected
-- during the load
SELECT
         GET_NUM_REJECTED_ROWS() AS NumRejectedRows
        ,GET_NUM_ACCEPTED_ROWS() AS NumAcceptedRows
;

SELECT 1 / (1-SIGN(GET_NUM_REJECTED_ROWS()));


-- Raise an Error condition if there are duplicates in my_table
SELECT 1 / ( 1 - SIGN( COUNT(*) ) )
FROM ( SELECT  name1,type1,description1
         FROM MY_TABLE
       GROUP BY 1,2,3
       HAVING COUNT(*) > 1 ) AS T1 ;

-- Raise an Error if primary key constraint is violated.
SELECT 1 / ( 1 - SIGN( COUNT(*) ) )
FROM (SELECT  ANALYZE_CONSTRAINTS ('my_table')) AS T1;

COMMIT;    
于 2012-09-29T12:45:06.183 に答える
1

Verticaにはストアドプロシージャがありません。Vertica以外の方法でプログラムで実行する必要があります。

あなたが持っている疑似論理は良いです。何か(JAVA、C ++など)に実装するだけです。'ロールバック'を実行する必要はありません。(を使用して)データをロードする場合、ステートメントNO COMMITを実行するまでデータはコミットされません。COMMIT

于 2012-09-29T01:24:19.130 に答える
0

ansiマージを使用するのはどうですか?

-高速バルクローダーを使用してデータを一時テーブルにアップロードします-一時テーブルからベーステーブルにマージします

于 2012-09-30T14:40:10.203 に答える