MySQL unterschiedliches Verhalten [gelöst]

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

MySQL unterschiedliches Verhalten [gelöst]

Beitrag von AlterMann »

Hallo

Ich habe in der Firma einen MySQL 5.5-Serer auf einem SBS Windows2003 laufen.
Da ich zuhause programmiere habe ich mir hier einen MYSQL-Server auf einem BananaPi (ähnlich einem RaspberryPi) installiert.

Funktioniert normalerweise wunderbar. Ich sichere in der Firma die Datenbank in eine SQL-Datei, spiele sie zuhause auf den Server und habe immer die aktuelle DB zur Verfügung.
Nun kopiere ich allerdings mehrere Zeilen auf einmal mit folgendem Code:

Code: Alles auswählen

 
   CREATE TEMPORARY TABLE tmp SELECT * FROM tabelle1 WHERE vertragsId = 10;
   UPDATE tmp SET Id = NULL, vertragsId = 11;
   INSERT INTO tabelle1 SELECT * FROM tmp;
   DROP TEMPORARY TABLE IF EXISTS tmp;
 
Das funktioniert zuhause tadellos.
In der Firma bekomme ich allerdings in der 2. Zeile eine Fehlermeldung daß "Id nicht NULL sein darf".

Was kann da schuld sein?
Für mich ist MySQL nur Mittel zum Zweck und ich verwende nur einfache Funktionen davon innerhalb meines Lazarusprogramms. Wirklich gut auskennen tu' ich mich leider nicht damit.

Hat wer eine Idee?
LG
Christian
Zuletzt geändert von AlterMann am Mi 20. Jan 2016, 06:54, insgesamt 1-mal geändert.
Früher war alles besser. Und aus Holz!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6783
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: MySQL unterschiedliches Verhalten

Beitrag von af0815 »

Er bemängelt das die Spalte ID den Wert Null annehmen soll. Ich habe gerade keinen Mysql am laufen um es zu testen. Laut dem Code von dir, versuchst du eine Schlüsselspalte mittels Null zu löschen (update). Nur ganz verstehe ich nicht was du mit den Befehlen willst, da du zurück in die Tabelle1 kopierst, halt nur mit einer neuen Vertragsid.

Generell für den Datentransport wie du ihn beschreibst würde ich das Tool mysqldump nehmen. Damit kann man die Datenbank sichern und später auch wieder in einen anderen Server einspielen. So bleiben die ganzen IDs erhalten.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: MySQL unterschiedliches Verhalten

Beitrag von hde »

Deine Angaben sind etwas spärlich, ich kann also nur raten.
Vermutlich ist die Datenbankstruktur zu Hause bei Dir und in der Firma unterschiedlich.
ID sieht nach einem Primärindex aus. Einmao wohl als AUTO_INCREMENT und in der anderen DB nur als NOT NULL definiert.
Bei AUTO_INCREMENT wird ID automatisch vergeben, im anderen Falle muss ID vorgegeben sein und darf nicht NULL sein.
Gruß hde

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: MySQL unterschiedliches Verhalten

Beitrag von AlterMann »

Danke für die schnellen Antworten

Also:

Die Funktion dient dazu (durch einen beliebigen Benutzer der nur mein Programm sieht, und nichts über die dahinterliegende Datenbank weiß) die Positionen eines Vertrags in einen neuen Vertrag zu kopieren.
Die vertragsId referenziert Stammdaten (Kunde, Bestellnummer, udgl.) in tabelle1 sind die einzelnen Produkpositionen aufgeführt.

Ich verstehe schon, daß er bemängelt, dass in tabelle tmp die Id nicht NULL werden darf, aber die Datenbank mit der tabelle1 ist 1:1 von der Firma heimgenommen.
Dort wie da ist Id ein Primärschlüssel mit Autoincrement und NULL ist nicht erlaubt.

Zuhause funktionierts, in der Firma nicht.

Ich hab's vorhin mit 0 statt NULL versucht

(

Code: Alles auswählen

CREATE TEMPORARY TABLE tmp SELECT * FROM tabelle1 WHERE vertragsId = 10;
   UPDATE tmp SET Id = 0, vertragsId = 11;
   INSERT INTO tabelle1 SELECT * FROM tmp;
   DROP TEMPORARY TABLE IF EXISTS tmp;
)

Hier (Zuhause) hat er das auch gefressen, vielleicht geht's so auch morgen, mal schauen.
Früher war alles besser. Und aus Holz!

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: MySQL unterschiedliches Verhalten [gelöst]

Beitrag von AlterMann »

Das hat geholfen.

Mit 0 statt NULL hat es auch hier mit dem Windows-MySQL-Server funktioniert.

Danke für's Helfen
Früher war alles besser. Und aus Holz!

Antworten