Laden...

[erledigt] Primary Key zu Tabelle hinzufügen (nachträglich)

Erstellt von Tweak90 vor 11 Jahren Letzter Beitrag vor 11 Jahren 4.330 Views
T
Tweak90 Themenstarter:in
24 Beiträge seit 2012
vor 11 Jahren
[erledigt] Primary Key zu Tabelle hinzufügen (nachträglich)

verwendetes Datenbanksystem: <SQLite>

Guten Tag,
ich habe in meiner Datenbank eine Tabelle mit 3 Spalten eingerichtet, bei welcher ich <ID> als pk festgelegt habe, nun muss ich aber 2 weitere spalten als primary key festlegen, da ein und die selbe ID mehr als einmal vorkommen kann und ich hier in nen konflikt gerate...

Meine Frage:
Wie kann ich nach einem Softwareupdate PKs hinzufügen?

4.931 Beiträge seit 2008
vor 11 Jahren

Hallo,

das nachträgliche Hinzufügen von Constraints oder Columns scheint bei SQLite eingeschränkt zu sein.
Evtl. hilft ein "Unique Index": How do I add primary key on existing table?

Oder aber eine neue Tabelle erstellen und Daten kopieren: Altering SQLite column type and adding PK constraint sowie Sqlite Add Primary Key

T
Tweak90 Themenstarter:in
24 Beiträge seit 2012
vor 11 Jahren
ALTER TABLE tableBase RENAME TO tableBasetemp;
CREATE TABLE tableBase (
a SHORT NOT NULL PRIMARY KEY,
b TEXT,
c SHORT NOT NULL PRIMARY KEY,
d SHORT NOT NULL PRIMARY KEY
)
INSERT INTO tableBase a,b,c,d FROM tableBasetemp;
DROP TABLE tableBasetemp;

So weit hab ich den SQLite befehl nun ausgebaut, mal sehen wenn ich zum testen komme ob es so auch klappt.

Versuche hier die betroffene Tabelle um zu benennen und anschließend eine neue tabelle anzuelegen, anschließend sollen die daten rüber und die alte tabelle gelöscht werden.

Bin jam al gespannt

F
10.010 Beiträge seit 2004
vor 11 Jahren

Stammt diese Tabelle aus den 80ern?
Oder warum sind da so sprechende namen drin?

T
Tweak90 Themenstarter:in
24 Beiträge seit 2012
vor 11 Jahren
		public static void UpdateTable()
		{
			CSDatabase.ExecuteNonQuery("ALTER TABLE tableBase RENAME TO tableBasetemp");
			CSDatabase.ExecuteNonQuery(GetCreateTableCommand());
			CSDatabase.ExecuteNonQuery("INSERT INTO tableBase a,b,c,d FROM tableBasetemp");
			CSDatabase.ExecuteNonQuery("DROP TABLE tableBasetemp");			
		}
        public static string GetCreateTableCommand()
        {
				return @"CREATE TABLE tableBase (
						a SHORT NOT NULL PRIMARY KEY,
						b TEXT,
                        c SHORT NOT NULL PRIMARY KEY,
                        d SHORT NOT NULL PRIMARY KEY
						)"; 					
        }

so sollte es gehen

habe die createTable methode seperat geschrieben um hier bei der neuinstallation eine gleich passende anzulegen, genau wie es vorher war, nur halt mit den passenden pks.

und nein, die tabelle stammt nicht aus den 80ern aber danke für dein ach so hilfreichen post troll
ich habe die namen der spalten und der tabelle geändert, die originale sind natürlich etwas aussagekräftiger und sinnvoller als die hier verwendeten.

habe sie jetzt durch Buchstaben ersetzt (hier im forum), tableBase und temp scheint mir für den zweck hier ausreichend.

Fehlermeldung:
SQLite unterstützt nur einen PK!

Damit ist die sachen an dieser stelle dann gegessen.
Neue Spalte mit fortlaufender ID als PK wird eingefügt... schade drum

F
10.010 Beiträge seit 2004
vor 11 Jahren

Wenn du hier das Forum mal lesen würdest könntest du die Frage schon verstehen, sie war nicht als trolling gemeint.
Es gibt tatsächlich Leute die meinen das die länge der Namen im Code möglichst kurz und unleserlich sein sollten.

Und zum Problem, hast du den ersten Link von Th69 gelesen?

T
Tweak90 Themenstarter:in
24 Beiträge seit 2012
vor 11 Jahren

Es gibt tatsächlich Leute die meinen das die länge der Namen im Code möglichst kurz und unleserlich sein sollten.){gray}

Kay sry, wollt dich net angreifen 😉 bin nur net so sehr in der thematik drin das ich hier sonderlich hilfreich wäre bei den meisten posts, deswegen stell ich meist eher fragen oder lese andere posts die zu meinem problem passen, da ist mir das noch net so aufgefallen bis jetzt 😉

Und zum Problem, hast du den ersten Link von Th69 gelesen?

jao hab ich,
habs jetzt einfach wie folgt angepasst:

        public static string GetCreateTableCommand()
        {
				return @"CREATE TABLE tableBase(
						ID INTEGER NOT NULL PRIMARY KEY,
						a SHORT,
						b TEXT,
                        c SHORT,
                        d SHORT
						)"; 					
        }
			public static void UpdateTable()
			{
				CSDatabase.ExecuteNonQuery("ALTER TABLE tableBase RENAME TO tableBasetemp");
				CSDatabase.ExecuteNonQuery(GetCreateTableCommand());
                CSDatabase.ExecuteNonQuery("INSERT INTO tableBase (a,b,c,d) SELECT a,b,c,d FROM tableBasetemp ");
				CSDatabase.ExecuteNonQuery("DROP TABLE tableBasetemp");			
			}

ID ist automatisch "Auto increment"

problem damit nun behoben, thread kann closed.