2014-01-16 10 views
13

Ich habe eine Tabelle Benutzer wie folgt erstellt:Cassandra - Was ist mit - „kann nicht nicht Primärschlüssel Teil umbenennen“

create table users (user_id text primary key, email text, first_name text, last_name text, session_token int); 

Ich beziehe mich auf die CQL Hilfe-Dokumentation auf der DataStax Website.

Ich möchte jetzt die E-Mail-Spalte in "E-Mails" umbenennen. Aber ich, wenn ich den Befehl ausführen -

alter table users rename email to emails; 

ich den Fehler bekommen - Bad Request: kann nicht nicht Primärschlüssel Teil E-Mail umbenennen

Ich bin mit CQL 3. Mein CQLSH ist 3.1.6 und C * ist 1.2.8.

Warum kann ich die obige Spalte nicht umbenennen? Wenn ich help alter table ausführe, wird die Option zum Umbenennen der Spalte angezeigt. Wie benenne ich die Spalte um?

Antwort

0

Der Hauptzweck der RENAME-Klausel besteht darin, die Namen von CQL 3-generierten Primärschlüssel- und Spaltennamen zu ändern, die in einer Legacy-Tabelle fehlen (mit COMPACT STORAGE erstellte Tabelle).

+3

Das beantwortet die Frage nicht. Sollte stattdessen ein Kommentar sein. – Amit

+0

Können Sie bitte auf die Dokumentation verweisen, die besagt, dass dies der Zweck ist? – Sumod

6

Um das Feld zu RENAME, die einzige Art, wie ich es bekam Arbeits das Feld zuerst tropfte und das Hinzufügen es dann in so es wie folgt lautet:.

alter table users drop email; 
alter table users add emails text; 
+0

Danke! Aber ich verstehe die Gründe für diese Einschränkung nicht. – asgs

+2

Verlieren alle Daten? –

+0

gibt es keine andere Alternative. verstehe die -1 nicht. – V31

10

In CQL, können Sie die Spalte umbenennen verwendet als Primärschlüssel, aber nicht andere. Dies scheint das Gegenteil von dem zu sein, was es sein sollte, man würde denken, dass der Primärschlüssel derselbe bleiben müsste und die anderen einfach zu ändern wären! Der Grund kommt von Implementierungsdetails.

Der Name des Primärschlüssels wird nicht in jede Zeile geschrieben, sondern an einem anderen Ort, der leicht änderbar ist. Bei Feldern ohne Primärschlüssel werden die Namen der Felder in jede Zeile geschrieben. Um die Spalte umzubenennen, müsste das System jede einzelne Zeile neu schreiben.

This article hat einige fantastische Beispiele und eine viel längere Diskussion über Cassandras Interna.

Um ein Beispiel direkt aus dem article, betrachten Sie dieses Beispiel Spalte Familie ausleihen:

cqlsh:test> CREATE TABLE example (
      ... field1 int PRIMARY KEY, 
      ... field2 int, 
      ... field3 int); 

ein wenig Daten eingeben:

cqlsh:test> INSERT INTO example (field1, field2, field3) VALUES (1,2,3); 

Und dann (CQLSH nicht) die Cassandra-CLI-Ausgabe von Abfragen dieser Spaltenfamilie:

[[email protected]] list example; 
------------------- 
RowKey: 1 
    => (column=, value=, timestamp=1374546754299000) 
    => (column=field2, value=00000002, timestamp=1374546754299000) 
    => (column=field3, value=00000003, timestamp=1374546754299000) 

Der Name des Primärschlüssels "field1" wird in keiner der Zeilen gespeichert, aber "field2" und "field3" werden ausgeschrieben. Um diese Namen zu ändern, müsste jede Zeile neu geschrieben werden.

Wenn Sie also wirklich eine nicht-primäre Spalte umbenennen wollen, gibt es grundsätzlich zwei verschiedene Strategien und keine davon ist sehr wünschenswert.

  1. Lassen Sie die Spalte fallen und fügen Sie sie zurück, wie ein anderes Poster erwähnt. Dies hat den großen Nachteil, dass alle Daten in dieser Spalte gelöscht werden.

oder

  1. Erstellen Sie eine neue Spalte Familie, die im Grunde eine Kopie der alten, aber mit der Säule in Frage umbenannt und Ihre Daten dort neu schreiben. Dies ist natürlich sehr rechenintensiv.
Verwandte Themen