Avatar billede ahrensberg Nybegynder
24. august 2006 - 23:30 Der er 14 kommentarer og
1 løsning

Bruge "select max" istedet for auto_increment.

Hej alle

Hvordan omskriver jeg nedenstående SQL så den virker?

INSERT INTO products (productnumber) VALUES ((SELECT MAX(productnumber) FROM product)+1)

... eller få det til at fungere på en anden måde? Jeg kan ikke sætte auto_increment på 'productnumber', da der allerede er et ID felt i tabellen som har dette, og derudover må der også godt forekomme flere hits i databasen med samme 'productnumber'.
Avatar billede coderdk Praktikant
25. august 2006 - 02:07 #1
Hvorfor bruger du så ikke den ID som produktnummer?
Avatar billede fsconsult.dk Nybegynder
25. august 2006 - 06:48 #2
INSERT INTO products (productnumber) SELECT MAX(productnumber)+1 FROM product
Avatar billede fsconsult.dk Nybegynder
25. august 2006 - 06:49 #3
forudsætter dog at der er mindst en record i tabellen allerede (og som har productnummer != null)
Avatar billede coderdk Praktikant
25. august 2006 - 09:55 #4
fsconsult, burde man så ikke bare kunne:

INSERT INTO products (productnumber) (COALESCE(SELECT MAX(productnumber)+1 FROM product,1)

? :) Bare et gæt
Avatar billede kjulius Novice
25. august 2006 - 11:06 #5
Burde der ikke stå products (med s) i både INSERT INTO og SELECT FROM, for jeg går ud fra, at der skal indsættes det nuv. højeste nr. + 1.?
Bare en tanke... :-)
Avatar billede fsconsult.dk Nybegynder
25. august 2006 - 12:17 #6
syntaksen hedder enten INSERT INTO <table> (<fieldlist>) VALUE (<valuelist>)
eller INSERT INTO <table> (<fieldlist>) <select-statement>
Avatar billede ahrensberg Nybegynder
25. august 2006 - 12:56 #7
coderdk:> Som sagt kan der godt forekomme flere hits i databasen med samme produktnummer, derfor kan dette felt ikke angives som ID.

fsconsult.dk.> Perfekt. Takker... Sjovt at (1) virker, men ikke (2) gør:
(1) INSERT INTO products (productnumber) (SELECT MAX(productnumber)+1 FROM products)
(2) INSERT INTO products (productnumber) VALUES (SELECT MAX(productnumber)+1 FROM products)
Avatar billede arne_v Ekspert
25. august 2006 - 13:28 #8
SQL syntax er #1 ikke #2

jeg synes at du skal overveje et tabel struktur redesign
Avatar billede fsconsult.dk Nybegynder
25. august 2006 - 14:28 #9
Arne>  begge SQL syntax er gældende. #2 hvis man  vil basere det på et query
Avatar billede ahrensberg Nybegynder
25. august 2006 - 14:50 #10
Nu prøvede jeg lige at anvende ovenstående i en større sammenhæng i nedenstående:

INSERT INTO product_unit_label (unit_id, language, label) (SELECT MAX(unit_id)+1 FROM product_unit_label, 1, 'stk')

... denne virker ikke. Nogen forslag til rettelser?
Avatar billede ahrensberg Nybegynder
25. august 2006 - 14:50 #11
... har desuden også prøvet:
INSERT INTO product_unit_label (unit_id, language, label) VALUES (SELECT MAX(unit_id)+1 FROM product_unit_label, 1, 'stk')
Avatar billede coderdk Praktikant
25. august 2006 - 15:00 #12
Hviklen version af MySQL bruger du?
Avatar billede kjulius Novice
25. august 2006 - 15:10 #13
--> fsconsult.dk: Jeg holder med arne. Det er ikke min erfaring, at man kan mixe VALUES og SELECT på den måde(#2). Du angiver jo også selv i 12:17:30, at der er de to syntaxes.

Altså det er min tro, at følgende er rigtigt

Tilladt:
INSERT INTO tabel (felt1, felt2, felt3) VALUES(1, 300, 'Test')
INSERT INTO tabel (felt1, felt2, felt3) SELECT felta, feltb, feltc FROM tabela

Ikke tilladt:
INSERT INTO tabel (felt1, felt2, felt3) VALUES(1, (SELECT feltb FROM tabela WHERE ID=1), 'Test')

Det sidste kan naturligvis simuleres ved i stedet at skrive
INSERT INTO tabel (felt1, felt2, felt3) SELECT 1, feltb, 'Test' FROM tabela WHERE ID=1

Hvis spørgeren derfor ønsker at oprette varer med flere felter angivet, vil jeg tro det skal gøres som:

INSERT INTO products (productnumber, description, price, producerid) SELECT (SELECT MAX(productnumber) + 1 FROM products), 'Hestebønner, 50 kg', 1332.45, 32 FROM products WHERE id=1
Avatar billede fsconsult.dk Nybegynder
25. august 2006 - 15:52 #14
INSERT INTO product_unit_label (unit_id, language, label)
SELECT MAX(unit_id)+1, 1, 'stk' FROM product_unit_label
Avatar billede kjulius Novice
25. august 2006 - 16:13 #15
--> fsconsult.dk: Det vil da normalt kræve en GROUP BY 1, 'stk', og så ryger fidusen med dit MAX(unit_id).

Jeg tror som sagt, at det skal skrives
INSERT INTO product_unit_label (unit_id, language, label)
SELECT (MAX(unit_id)+1 FROM product_unit_label), 1, 'stk' FROM tabelmed1række
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester