Gelöst: SQL Copy von Tabelleneinträgen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Gelöst: SQL Copy von Tabelleneinträgen

Beitrag von WSO »

Moin Zusammen.
Ich habe unter Win 7, LO4.2, mysql 5.6 mit navtive Mysql extension 1.02 folgendes laufen, funtioniert:

Code: Alles auswählen

	' Angebotspositionen kopieren (MySql)
      	stSql = "CREATE TEMPORARY TABLE tmpcopyangebotpos SELECT * FROM tangebot WHERE ang_ako_id = " & iKey
		oSQL_Statement.executeUpdate(stSql)
		
		stSql = "UPDATE tmpcopyangebotpos SET ang_ako_id =" &"'" & iNeu & "', " & "ang_id=null"
		oSQL_Statement.executeUpdate(stSql)
		
		stSql = "INSERT INTO tangebot SELECT * FROM tmpcopyangebotpos"
		oSQL_Statement.executeUpdate(stSql)	
		
		stSql = "COMMIT"
		oSQL_Statement.executeUpdate(stSql)
Die Prim-Key der Tabelle "tangebot" ist "ang_id" und hat AUTOWERT.
Unter Linux mit (Mint 17, Mysql-JDBC) bekomme ich einen SQL-Fehler:
"ang_id" darf nicht "null" sein. Ohne die Zuweisung von "null" gibt es natürlich duplicate value ...
Leider habe ich diese SQL-Syntax häufg verwendet und möchte nur ungerne das issue mit dem woraround
(selct und insert feldweise) umgehen. Ist ja auch wartungsanfälliger.
Hat jemand eine bessere Idee?
Gruss,
WSO
Zuletzt geändert von WSO am Mi, 13.08.2014 13:11, insgesamt 2-mal geändert.
Axel Richter
****
Beiträge: 159
Registriert: So, 17.10.2010 16:54

Re: SQL Copy von Tabelleneinträgen

Beitrag von Axel Richter »

Hallo,
SQL-Fehler:
"ang_id" darf nicht "null" sein
Dieser Fehler bedeutet, dass die Tabelle beim Erzeugen mit der Einschränkung (constraint) NOT NULL für diese Spalte erstellt wurde.

Wenn man trotzdem NULL-Werte dort einfügen konnte, war wohl der Server SQL-Mode weniger strict als jetzt. Siehe http://dev.mysql.com/doc/refman/5.0/en/sql-mode.html.

Die beste Lösung ist aber *nicht* den Server SQL-Mode wieder weniger strict zu machen. Wenn NULL Werte erlaubt sein sollen, dann müssen NULL-Werte erlaubt sein ;-). Überarbeite also die Tabellendefinition, damit diese erlaubt sind.

viele Grüße

Axel
WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Re: SQL Copy von Tabelleneinträgen

Beitrag von WSO »

Hallo Axel,
ja das ist mir klar und soll auch so sein.
Nur, ich will Mysql ja veranlassen für die zu kopierenden Sätze neue IDs (ungleich Null) automatisch zu vergeben.
Wie soll das anders gehen als mit Nullwert in dem ID-Feld?
Gruss,
WSO
Axel Richter
****
Beiträge: 159
Registriert: So, 17.10.2010 16:54

Re: SQL Copy von Tabelleneinträgen

Beitrag von Axel Richter »

Hallo,

das AUTO_INCREMENT wird verwendet, wenn man die betroffene Spalte beim INSERT *gar nicht* angibt.

Möglichkeit 1:
Die Tabelle tmpcopyangebotpos darf also das Feld ang_id gar nicht enthalten. Also muss das SELECT * beim CREATE TEMPORARY TABLE durch ein SELECT [Feldliste] ersetzt werden.

Möglichkeit 2:
Die Spalte ang_id darf beim INSERT nicht eingefügt werden. Also muss das SELECT * beim INSERT durch ein SELECT [Feldliste] ersetzt werden.

viele Grüße

Axel
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: SQL Copy von Tabelleneinträgen

Beitrag von DPunch »

Servus
Axel Richter hat geschrieben:das AUTO_INCREMENT wird verwendet, wenn man die betroffene Spalte beim INSERT *gar nicht* angibt.
...oder explizit NULL für die Auto-Wert Spalte übergibt.
WSO hat geschrieben:Hat jemand eine bessere Idee?
Du könntest mal ein

Code: Alles auswählen

stSql = "ALTER TABLE tmpcopyangebotpos MODIFY COLUMN ang_id INT"
oSQL_Statement.executeUpdate(stSql)
vor dem Update probieren - damit entfernst Du die "NOT NULL"-Beschränkung aus ang_id in der kopierten Tabelle.
WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Re: SQL Copy von Tabelleneinträgen

Beitrag von WSO »

Moin Axel,
super, danke dir.
So geht's. Hat mir viel Kodieraufwand erspart.
:)
Gruss,
Wolfram
Antworten