[MySQL] Insert into....SELECT foutje

Pagina: 1
Acties:
  • 51 views sinds 30-01-2008

  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Hoi,
Ik heb een foutmelding wat wijst op een foreign key problemen, maar heb die niet kunnen elimineren.
Hier is de situatie:
tabel artikel(PLU, prijs, omschrijving, enz.)
vb. (4023, 1.10, Cola blikje,...)
tabel werknemer(sofinummer, naam, enz.)
vb. (123456789, persa,...)
tabel verkooplijst(verkoop_id, PLU, sofinummer, verkoopprijs, enz.)

verkoop_id is AUTO_INCREMENT
verkooplijst PLU refereert naar artikel (cascade on update, restrict on delete)
verkooplijst sofinummer refereert naar werknemer (cascade on update, restrict on delete)

De db is van type InnoDB (om met foreign keys te kunnen werken)
De bedoeling is d.m.v. insert into...select de verkooplijst bij te werken waarbij de prijs automatisch wordt ingevuld.
Ik kom uit op deze statement:

INSERT INTO verkooplijst(PLU, sofinummer, verkoopprijs)
SELECT '4023', `sofinummer` FROM werknemer WHERE werknemer.sofinummer = '123456789', `prijs`FROM artikel WHERE artikel.PLU='4023';

Ik heb voor het gemak de rest van de atributen weggelaten, want in de fout melding krijg ik de gerefereerde kolommen terug. Het kan geen add of update doen omdat een foreignkey contraint fails.
Ik zou graag willen weten wat ik fout doe.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Kun je de exacte SQL posten die je gebruikt hebt, want dit lijkt nergens op.
code:
1
2
3
4
5
INSERT INTO verkooplijst(PLU, sofinummer, verkoopprijs)
SELECT '4023', `sofinummer`, ??? 
FROM werknemer 
WHERE werknemer.sofinummer = '123456789' 
--?? , `prijs`FROM artikel WHERE artikel.PLU='4023';

[ Voor 8% gewijzigd door justmental op 12-01-2004 11:49 ]

Who is John Galt?


  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 09-05 11:54

VisionMaster

Security!

En bij voorkeur de create scripts voor je tabellen, want daar kunnen ook fouten in zijn ontstaan, die tesamen met de SQL anders lastiger te zijn te traceren.

I've visited the Mothership @ Cupertino


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
geprobeerde sql query:
code:
1
2
3
4
5
insert into verkooplijst(PLU, verkoopprijs, sofinummer)
select 
     '4023',
     `prijs` from artikel where plu = '4023'
     `sofinummer` from werknemer.sofinummer = '123456789';


Ook aantal andere variaties hierop geprobeerd.
Ik heb wel uit kunnen vissen dat dit werkt:
code:
1
2
3
4
5
insert into verkooplijst(PLU, sofinummer,verkoopprijs)
select 
     '4023',
     '123456789',
     `prijs` from artikel where plu = '4023';


De rest van de velden (verkoop_id, enz.) worden automatisch ingevuld (auto_increment, NULL, timestamp) na het uitvoeren van de query.
Dus ik mag geen dubbele "referenties" in 1 insert into...select query opnemen?

[edit]:
dit is de create query:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
CREATE TABLE `werknemer` (
  `naam` varchar(50) NOT NULL default '',
  `voornaam` varchar(50) NOT NULL default '',
  `adres` varchar(100) NOT NULL default '',
  `postcode` varchar(7) NOT NULL default '',
  `plaats` varchar(50) NOT NULL default '',
  `tel1` varchar(10) NOT NULL default '0',
  `tel2` varchar(10) default '0',
  `sofinummer` varchar(9) NOT NULL default '0',
  `geboorte_datum` date NOT NULL default '0000-00-00',
  `geslacht` char(1) NOT NULL default '',
  `datum_indienst` date NOT NULL default '0000-00-00',
  `datum_uitdienst` date default '0000-00-00',
  `gebruiker` char(2) NOT NULL default '',
  `password` varchar(5) NOT NULL default '',
  `legitimatie_nummer` varchar(20) NOT NULL default '',
  PRIMARY KEY  (`sofinummer`),
  UNIQUE KEY `legitimatie_nummer` (`legitimatie_nummer`),
  UNIQUE KEY `gebruiker` (`gebruiker`),
  KEY `vnaam_naam` (`naam`,`voornaam`)
) TYPE=InnoDB COMMENT='Gegevens van werknemers';

CREATE TABLE `artikel` (
  `PLU` smallint(6) NOT NULL default '0',
  `artikel_omschrijving` varchar(100) NOT NULL default '',
  `rapportcode` varchar(5) NOT NULL default '',
  `prijs` decimal(10,2) NOT NULL default '0.00',
  `barcode` varchar(15) NOT NULL default '0',
  `barcode_verpakking` varchar(15) default '0',
  `aantal_per_verpakking` smallint(6) default '0',
  `datum` date NOT NULL default '0000-00-00',
  `bestelnivo` int(11) NOT NULL default '0',
  `boekvoorraad` int(11) NOT NULL default '0',
  `maximumvoorraad` int(11) NOT NULL default '0',
  `specs` varchar(100) default '',
  PRIMARY KEY  (`PLU`),
  KEY `rapportcode` (`rapportcode`),
  KEY `barcode` (`barcode`),
  KEY `barcode_verpakking` (`barcode_verpakking`),
  foreign key (rapportcode) references hoofdgroepen(rapportcode)
  ON UPDATE CASCADE
  ON DELETE RESTRICT
) TYPE=InnoDB COMMENT='Overzicht van alle artikelen/diensten die worden aangeboden';

CREATE TABLE `verkooplijst` (
  `verkoop_id` int(11) NOT NULL auto_increment,
  `PLU` smallint(6) NOT NULL default '0',
  `verkoopprijs` decimal(10,2) NOT NULL default '0.00',
  `sofinummer` varchar(9) NOT NULL default '',
  `Lgg:bedr` varchar(5) default NULL,
  `waarde` varchar(5) default NULL,
  `tstamp` timestamp(14) NOT NULL,
  PRIMARY KEY  (`verkoop_id`),
  KEY `PLU` (`PLU`),
  KEY `sofinummer` (`sofinummer`),
  CONSTRAINT `0_28` FOREIGN KEY (`PLU`) REFERENCES `artikel` (`PLU`) ON UPDATE cascade on delete restrict,
  CONSTRAINT `0_29` FOREIGN KEY (`sofinummer`) REFERENCES `werknemer` (`sofinummer`) ON UPDATE cascade on delete restrict
) TYPE=InnoDB COMMENT='Elk verkochte item per werknemer per timestamp';

[ Voor 68% gewijzigd door turkosh op 12-01-2004 13:24 ]


  • Rafe
  • Registratie: Mei 2002
  • Laatst online: 27-06-2025
Programmeren hoort in Programming & Webscripting dus bij deze :)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Voor het gebruik van de INSERT INTO ... SELECT syntax moet je voor het SELECT gedeelte de gewone "SELECT" syntax gebruiken, en niet zelf iets met meerdere FROM en WHERE clauses gaan bedenken ;)

http://www.mysql.com/doc/en/SELECT.html

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Het ging mij meer om het oplossen van de foutmelding. Maar ja "that's GoT", je begint met één en eindigt met een ander (niet vies bedoeld ;-) ).

  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 09-05 11:54

VisionMaster

Security!

turkosh schreef op 12 januari 2004 @ 13:18:
geprobeerde sql query:
code:
1
2
3
4
5
insert into verkooplijst(PLU, verkoopprijs, sofinummer)
select 
     '4023',
     `prijs` from artikel where plu = '4023'
     `sofinummer` from werknemer.sofinummer = '123456789';


Ook aantal andere variaties hierop geprobeerd.
Ik heb wel uit kunnen vissen dat dit werkt:
code:
1
2
3
4
5
insert into verkooplijst(PLU, sofinummer,verkoopprijs)
select 
     '4023',
     '123456789',
     `prijs` from artikel where plu = '4023';


De rest van de velden (verkoop_id, enz.) worden automatisch ingevuld (auto_increment, NULL, timestamp) na het uitvoeren van de query.
Dus ik mag geen dubbele "referenties" in 1 insert into...select query opnemen?

[..]
Die gekke quotes ` storen mij een beetje. Die zijn nergens voor nodig en kunnen alleen maar parse/interpretatie problemen opleveren in SQL.
Verder is je tweede voorbeeldje wel goed en de eerste zeker niet. Je moet aangeven achter de from welke tabel je wilt uitlezen en vervolgens een where te doen met een boolean expressie.

I've visited the Mothership @ Cupertino


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Die gekke quotes zorgen er in MySQL voor dat hij de woorden die tussen die quotes niet als keywords gaat gaan aanzien. Het is dus om parse-errors te voorkomen.
Maar goed, ik ben eerder een voorstander van column-names die geen keyword zijn, dan heb je die backticks niet nodig.

[ Voor 27% gewijzigd door whoami op 12-01-2004 14:52 ]

https://fgheysels.github.io/


  • turkosh
  • Registratie: December 2003
  • Laatst online: 26-04-2025
Je hebt gelijk, ik vind die quates ook storend. Maar dit is hoe je de gegevens uit MySQL krijgt.
Je voert in create table zus (enzo varchar(100));
en je krijgt create table `zus`(`enzo` varchar(100));

Dus dacht ik, hou maar op de MySQL wijze.

En ik ben er ook achter dat de eerste statement niet correct is ;-)
De vraag is, kan ik wel een correcte statement maken die verdacht veel op de eerste lijkt (dus met eigenlijk 2 select from gedeeltes)?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Yep, dat kan je.
Echter, dit is gewoon basis-sql kennis. En zoals drm al eerder zij: neem even een SQL manual/tutorial erbij, en bekijk die eerst even zodat je de juiste syntax kent, ipv zelf te gaan prutsen/experimenteren/prutsen.

https://fgheysels.github.io/

Pagina: 1

Dit topic is gesloten.