Wie lautet die Syntax zum Angeben eines Primärschlüssels für mehr als 1 Spalte in SQLITE?SQL-Primärschlüssel in mehreren Spalten
Antwort
Nach dem documentation, es ist
CREATE TABLE something (
column1,
column2,
column3,
PRIMARY KEY (column1, column2)
);
Nun, das ist richtig, aber nach der Dokumentation CREATE TABLE etwas (Spalte1 PRIMARY KEY, column2 PRIMARY KEY); sollte auch möglich sein, aber es ist nicht möglich. – Yar
@Yar Die Dokumente sagen "Wenn es mehr als eine PRIMARY KEY-Klausel in einer einzelnen CREATE TABLE-Anweisung gibt, handelt es sich um einen Fehler." Ja, die Eisenbahndiagramme zeigen möglicherweise an, dass das auch zutrifft, aber der folgende Text verdeutlicht, dass dies nicht der Fall ist. –
Denken Sie daran, den Teil * PRIMARY KEY (column1, column2) * am Ende wie in dieser Antwort hinzuzufügen. Wenn Sie versuchen, es nach der column2-Definition hinzuzufügen, erhalten Sie einen Syntaxfehler **. – vovahost
Ja. Aber denken Sie daran, dass solche Primärschlüssel Werte in beiden Spalten mehrmals zulassen.
eine Tabelle als solche erstellen:
sqlite> CREATE TABLE something (
column1, column2, value, PRIMARY KEY (column1, column2));
Jetzt funktioniert dies ohne Vorwarnung:
sqlite> insert into something (value) VALUES ('bla-bla');
sqlite> insert into something (value) VALUES ('bla-bla');
sqlite> select * from something;
NULL|NULL|bla-bla
NULL|NULL|bla-bla
Gibt es einen Hinweis auf den Grund eines solchen Verhaltens? Was wäre eine gute Möglichkeit, mehrere Zeilen in der Datenbank abzulegen und trotzdem Duplikate zu entfernen, selbst wenn sie 'NULL' enthalten? – Pastafarianist
@Pastafarianist http://www.sqlite.org/lang_createtable.html - "Nach dem SQL-Standard sollte PRIMARY KEY immer NOT NULL beinhalten.Leider ist dies in SQLite aufgrund eines Fehlers in einigen früheren Versionen nicht der Fall. [...] NULL-Werte werden von allen anderen Werten, einschließlich anderer NULL-Werte, unterschieden. " –
Ja, in SQL-NULL-Werten wird immer false verglichen. Aus diesem Grund schließt die relationale Theorie NULL ausdrücklich als Wert einer Schlüsselkomponente aus Es scheint, dass die Autoren pragmatisch die mehrfache, aber nicht "gleiche" Schlüsseln zulassen. Es ist klar, dass NULLs nicht als Schlüsselwerte erlaubt sind. – holdenweb
CREATE TABLE something (
column1 INTEGER NOT NULL,
column2 INTEGER NOT NULL,
value,
PRIMARY KEY (column1, column2)
);
Bedeutet Primärschlüssel keinen NOT NULL? – pratnala
@pratnala In Standard-SQL Ja, in SQLite ist 'NULL' in Primärschlüsseln erlaubt Diese Antwort betont, dass, wenn Sie mehr Standardverhalten wollen, müssen Sie das' NOT NULL' selbst hinzufügen. Meine Antwort ist nur die sehr einfache Syntax für eine Mehrspalte Primärschlüssel. –
Primärschlüsselfelder als nicht für nichtig erklärt werden sollte (dies nicht Standard, wie das ist Definition eines Primärschlüssels ist, dass es eindeutig sein muss und nicht null). Aber unten ist eine gute Praxis für alle mehrspaltigen Primärschlüssel in jedem DBMS.
create table foo
(
fooint integer not null
,foobar string not null
,fooval real
,primary key (fooint, foobar)
)
;
Seit Version 3.8.2 von SQLite, eine Alternative zu den expliziten NOT NULL-Spezifikationen ist die "OHNE ROWID" Spezifikation: [1]
NOT NULL is enforced on every column of the PRIMARY KEY
in a WITHOUT ROWID table.
"OHNE ROWID" Tabellen mögliche Effizienzvorteile haben, so eine weniger ausführliche alternative zu betrachten ist:
CREATE TABLE t (
c1,
c2,
c3,
PRIMARY KEY (c1, c2)
) WITHOUT ROWID;
beispielsweise an der sqlite3 Prompt: sqlite> insert into t values(1,null,3); Error: NOT NULL constraint failed: t.c2
Basic:
CREATE TABLE table1 (
columnA INTEGER NOT NULL,
columnB INTEGER NOT NULL,
PRIMARY KEY (columnA, columnB)
);
Wenn Ihre Spalten Fremdschlüssel der anderen Tabellen (allgemeiner Fall) sind:
CREATE TABLE table1 (
table2_id INTEGER NOT NULL,
table3_id INTEGER NOT NULL,
FOREIGN KEY (table2_id) REFERENCES table2(id),
FOREIGN KEY (table3_id) REFERENCES table3(id),
PRIMARY KEY (table2_id, table3_id)
);
CREATE TABLE table2 (
id INTEGER NOT NULL,
PRIMARY KEY id
);
CREATE TABLE table3 (
id INTEGER NOT NULL,
PRIMARY KEY id
);
Auf eine andere Weise können Sie auch die zweispaltigen Primärschlüssel machenunique
und Auto-Inkrement Schlüssel primary
. Genau wie folgt aus: https://stackoverflow.com/a/6157337
- 1. Duplikate in mehreren Spalten
- 2. Suchbegriff in mehreren Spalten finden
- 3. Splitting Links in mehreren Spalten
- 4. gleiche Beobachtung in mehreren Spalten
- 5. MySQL Suche in mehreren Spalten
- 6. gleiche Zeichen in mehreren Spalten in MySQL
- 7. QDockWidgets in QMainWindow in mehreren Spalten anordnen
- 8. Anzeigen einzelner Spalten Daten in mehreren Spalten mit unterschiedlichen Bedingungen
- 9. ORMLITE ORDER_BY mit mehreren Spalten
- 10. data.table Merge von mehreren Spalten
- 11. Cassandra Auftrag von mehreren Spalten
- 12. SQL Pivot mit mehreren Spalten
- 13. MySQL Unterabfrage mit mehreren Spalten
- 14. CHECK-Einschränkung auf mehreren Spalten
- 15. Tabellen mit mehreren Varbinary-Spalten
- 16. html Listenelement mit mehreren Spalten
- 17. Umbenennen Spalten in mehreren Datenrahmen, R
- 18. R data.table ersetze Werte in mehreren Spalten
- 19. einen Teil einer Zeichenfolge in mehreren Spalten
- 20. Wie wird in mehreren Spalten gezählt?
- 21. Barplot mit mehreren Spalten in R
- 22. Datum Arithmetik mit mehreren Spalten in PySpark
- 23. Partitionierung von mehreren Spalten in Spark-SQL
- 24. parametrisiert IN-Klausel mit mehreren Spalten
- 25. Nach mehreren Spalten in ActiveRecord gruppieren
- 26. Nhibernate Mapping-Beziehungen in mehreren Spalten
- 27. Gruppe von mehreren Spalten in Laravel
- 28. TSQL Zählung Vorkommen in mehreren Spalten
- 29. rails searchlogic plugin Suche in mehreren Spalten
- 30. Wie werden Datensätze in mehreren Spalten verknüpft?
Dies auch Verbundschlüssel genannt wird http://en.wikipedia.org/wiki/Compound_key – OneWorld
@OneWorld oder Composite-Taste, wenn eine der Spalten ist kein Schlüssel selbst. – Michael