2015-10-14 3 views
0

La description des spécifications CQL3 de l'instruction UPDATE commence par le paragraphe suivant:Des lignes spécifiques d'une partition doivent-elles être spécifiées pour mettre à jour et/ou supprimer des colonnes statiques?

L'instruction UPDATE écrit une ou plusieurs colonnes pour une ligne donnée dans un tableau . La clause (where) est utilisée pour sélectionner la ligne à mettre à jour et doit inclure toutes les colonnes composant la PRIMARY KEY (la relation IN est uniquement prise en charge par pour la dernière colonne de la clé de partition). Les autres colonnes sont spécifiées après le mot clé SET.

La description dans la spécification de l'instruction DELETE commence par un paragraphe similaire:

L'instruction DELETE supprime les colonnes et les lignes. Si les noms de colonne sont fournis directement après le mot-clé DELETE, seules ces colonnes sont supprimées de la ligne indiquée par la clause (where-clause) (la syntaxe id [value] dans (selection) est pour la collection , veuillez vous reporter à la collection section pour plus de détails). Sinon, les lignes entières sont supprimées. La clause (where) permet de spécifier la clé pour la ou les lignes à supprimer (la relation IN n'est prise en charge que pour la dernière colonne de la clé de partition).

Les portions en gras de chacun de ces descriptions état, en termes simples, que ces états peuvent être utilisés pour modifier les données d'une manière basée sur les lignes uniquement. Cependant, étant donné la nature de la relation (ou son absence) entre les lignes et les colonnes statiques (qui existent indépendamment d'une ligne particulière) d'une table, il semble qu'il devrait y avoir un moyen de modifier ces colonnes étant donné seulement les clés des partitions dans lesquelles ils sont respectivement contenus. Selon la spécification cependant, cela ne semble pas possible, et je ne suis pas sûr que ce soit un produit de la difficulté d'autoriser cela dans la syntaxe CQL3, ou autre chose. Si une colonne statique ne peut pas être mise à jour ou supprimée indépendamment de n'importe quelle ligne de sa table, alors ces opérations sont couplées à leurs homologues à colonnes non statiques, rendant l'ensemble des colonnes ciblées par de telles opérations, difficile à déterminer . Par exemple, étant donné une table peuplée avec la définition suivante:

CREATE TABLE IF NOT EXISTS example_table 
(
    partitionKeyColumn  int 
    clusteringColumn   int 
    nonPrimaryKeyColumn  int 
    staticColumn    varchar static 
    PRIMARY KEY    (partitionKeyColumn, clusteringColumn) 
) 

... il est pas évident si les déclarations SUPPRIMER suivantes sont équivalentes:

//#1 (Explicitly specifies all of the columns in and "in" the target row) 
DELETE partitionKeyColumn, clusteringColumn, nonPrimaryKeyColumn, staticColumn FROM example_table WHERE partitionKeyColumn = 1 AND clusteringColumn = 2 

//#2 (Implicitly specifies all of the columns in (but not "in"?) the target row) 
DELETE FROM example_table WHERE partitionKeyColumn = 1 AND clusteringColumn = 2 

Alors, phrasé mes observations sous forme de question :

  1. Les instructions DELETE ci-dessus sont-elles équivalentes?
  2. La clé primaire d'au moins une ligne d'une table CQL3 doit-elle être fournie pour mettre à jour ou supprimer une colonne statique dans cette table? Si oui, pourquoi?

Répondre

3

Je ne sais pas, mais la spécification dans le monde réel cassandra, vos deux déclarations ne sont pas SUPPRIMER équivalent.

La première instruction supprime la static_column alors que la seconde ne l'est pas. La raison en est que les colonnes statiques sont partagées par des lignes. Vous devez le spécifier explicitement pour le supprimer réellement.

En outre, je ne pense pas que ce soit une bonne idée de supprimer les colonnes statiques et les colonnes non statiques en même temps. Soit dit en passant, cette déclaration ne fonctionnera pas:

DELETE staticColumn FROM example_table WHERE partitionKeyColumn = 1 AND clusteringColumn = 2 

La sortie d'erreur est:

Bad Request: Invalid restriction on clustering column priceable_name since the DELETE statement modifies only static columns