2016-03-08 1 views
0

me reste que cette table:Teradata: Comment ajouter une partition de plage à une table non vide?

CREATE SET TABLE ONLINE_BANKING.TRANSACTIONS ,NO FALLBACK , 
    NO BEFORE JOURNAL, 
    NO AFTER JOURNAL, 
    CHECKSUM = DEFAULT, 
    DEFAULT MERGEBLOCKRATIO 
    (
     transaction_id INTEGER NOT NULL, 
     date_of_transaction DATE FORMAT 'YYYYMMDD' NOT NULL, 
     amount_of_transaction DECIMAL(38,2) NOT NULL, 
     transaction_type_code BYTEINT NOT NULL DEFAULT 25 , 
UNIQUE PRIMARY INDEX (transaction_id); 

Je voudrais ajouter une partition à mon remplie de table de données à la colonne date_of_transaction.

J'ai essayé de cette façon:

ALTER TABLE TRANSACTIONS 
MODIFY PRIMARY INDEX (date_of_transaction) -- tried to write different columns, but failed 
ADD RANGE BETWEEN DATE '1998-01-01' AND DATE '2015-12-31' EACH INTERVAL '1' MONTH; 

Cependant Teradata a renvoyé l'erreur:

DROP RANGE/ADD RANGE clause no corresponding level that is a RANGE_N function

Qu'est-ce que cela signifie et que comment puis-je atteindre l'objectif?

Répondre

2

Vous ne pouvez pas ajouter de partitionnement à une table existante qui n'est pas partitionnée, mais vous pouvez uniquement ajouter ou supprimer des plages d'une table partitionnée.

La seule façon est de créer une nouvelle table et comme ce INSERT/SELECT:

CREATE SET TABLE ONLINE_BANKING.TRANSACTIONS_PPI ,NO FALLBACK , 
    NO BEFORE JOURNAL, 
    NO AFTER JOURNAL, 
    CHECKSUM = DEFAULT, 
    DEFAULT MERGEBLOCKRATIO 
    (
     transaction_id INTEGER NOT NULL, 
     date_of_transaction DATE FORMAT 'YYYYMMDD' NOT NULL, 
     amount_of_transaction DECIMAL(38,2) NOT NULL, 
     transaction_type_code BYTEINT NOT NULL DEFAULT 25 , 
     ...) 
PRIMARY INDEX (transaction_id) 
PARTITION BY 
    RANGE_N (date_of_transaction BETWEEN DATE '1998-01-01' AND DATE '2015-12-31' 
    EACH INTERVAL '1' MONTH); 

INSERT INTO ONLINE_BANKING.TRANSACTIONS_PPI 
SELECT * FROM ONLINE_BANKING.TRANSACTIONS; 

-- when everything is ok 
DROP TABLE ONLINE_BANKING.TRANSACTIONS; 
RENAME TABLE ONLINE_BANKING.TRANSACTIONS_PPI AS ONLINE_BANKING.TRANSACTIONS; 
+0

Merci pour la réponse, mais je me manque quelque chose. TD continue de dire que le type de données (date_of_action) ne correspond pas à un nom de type défini teradata'. Qu'est-ce qui ne va pas? – Rocketq

+1

@Rocketq: J'ai corrigé ma réponse (à beaucoup couper & coller), maintenant ça devrait marcher ... – dnoeth