Hoe maak ik een custom auto increment kolom met SQL

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Oracle APEX Developer PL/SQL

Bedrijfsomschrijving Als je altijd al in een Europees georiënteerde organisatie hebt willen werken, ben je hier aan het juiste adres! De organisatie biedt IT- en communicatieoplossingen aan kleine, middelgrote en grote ondernemingen in zowel de private als de publieke sector. De innovatieve oplossingen, ontworpen voor open connectiviteit, hoge beschikbaarheid en flexibele groei, bevatten de nieuwste spraak-, data- en videotechnologieën en maken real-time, samenwerking, verhoogde productiviteit en klanttevredenheid mogelijk. Samen met een team van 6 personen zullen jullie onder andere verantwoordelijk worden voor het ontwikkelen en verbeteren van business applicaties, ontwikkeld in Oracle Apex. Deze applicaties worden op dit moment voor

Bekijk vacature »

Pagina: 1 2 volgende »

Snelle Jaap

Snelle Jaap

03/02/2021 12:04:16
Quote Anchor link
Ik heb een tabel met een order id kolom. Die kolom ziet er als volgt uit:

Bijvoorbeeld: 33.1000

33 is het id van de gebruiker, en 1000 is het aantal orders (totaal, dus 33.1000 kan worden opgevold door bijvoorbeeld 50.1001, 62.1002 etc).

Het account id sla ik los op in de order tabel maar ik zou niet weten hoe ik die plak aan een order id kolom met daarnaast een auto increment na de punt die begint bij 1000.

Hoe doe ik zoiets?
 
PHP hulp

PHP hulp

14/04/2021 09:39:09
 
- Ariën -
Beheerder

- Ariën -

03/02/2021 12:20:31
Quote Anchor link
Autoincrement moet je als een intern getal zien waar jijzelf niet mee te maken hebt.
 
Snelle Jaap

Snelle Jaap

03/02/2021 12:24:46
Quote Anchor link
Hoe bedoel je? Het is toch mogelijk om een waarde automatisch te laten optellen bij elke insert? Ik weet dat het kan met iets simpels als een id tabel (alleen cijfers) maar hoe dit werkt in combinatie een andere waarde zou ik niet weten.

Ik las iets over een computed kolom waarmee je een waarde kan combineren met auto increment maar kom er niet uit hoe dit te doen.
 
Adoptive Solution

Adoptive Solution

03/02/2021 12:51:38
Quote Anchor link
Dit is een simpel voorbeeld hoe je waarden automatisch invult tijdens insert/update

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
DROP TABLE IF EXISTS `good_sub`;
CREATE TABLE `good_sub` (
  `num1` bigint(20) unsigned DEFAULT NULL,
  `num2` bigint(20) unsigned DEFAULT NULL,
  `vnum` bigint(20) AS (CAST(num1 AS SIGNED) - CAST(num2 AS SIGNED)) PERSISTENT,
  `vindx` varchar(25) AS ( CONCAT ( num1, ".", num2 )) PERSISTENT,
  UNIQUE KEY `vindx` (`vindx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

# De waarden vnum en vindx worden uitgerekend tijdens de insert/update
INSERT INTO `good_sub` (`num1`, `num2`) VALUES
(1001,    12),
(1001,    13);
 
Snelle Jaap

Snelle Jaap

03/02/2021 13:05:32
Quote Anchor link
Adoptive Solution op 03/02/2021 12:51:38:
Dit is een simpel voorbeeld hoe je waarden automatisch invult tijdens insert/update

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
DROP TABLE IF EXISTS `good_sub`;
CREATE TABLE `good_sub` (
  `num1` bigint(20) unsigned DEFAULT NULL,
  `num2` bigint(20) unsigned DEFAULT NULL,
  `vnum` bigint(20) AS (CAST(num1 AS SIGNED) - CAST(num2 AS SIGNED)) PERSISTENT,
  `vindx` varchar(25) AS ( CONCAT ( num1, ".", num2 )) PERSISTENT,
  UNIQUE KEY `vindx` (`vindx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

# De waarden vnum en vindx worden uitgerekend tijdens de insert/update
INSERT INTO `good_sub` (`num1`, `num2`) VALUES
(1001,    12),
(1001,    13);


Ik krijg de volgende foutmelding als ik die queries probeer uit te voeren:

MySQL meldt: Documentatie

#1064 - Er is iets fout in de gebruikte syntax bij 'PERSISTENT,
`vindx` varchar(25) AS ( CONCAT ( num1, ".", num2 )) PERSISTENT,
' in regel 4
 
Adoptive Solution

Adoptive Solution

03/02/2021 13:33:48
Quote Anchor link
Probeer het eens met :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
DROP TABLE IF EXISTS `good_sub`;
CREATE TABLE `good_sub` (
  `num1` bigint(20) unsigned DEFAULT NULL,
  `num2` bigint(20) unsigned DEFAULT NULL,
  `vnum` bigint(20) GENERATED ALWAYS AS (cast(`num1` as signed) - cast(`num2` as signed)) STORED,
  `vindx` varchar(25) GENERATED ALWAYS AS (concat(`num1`,'.',`num2`)) STORED,
  UNIQUE KEY `vindx` (`vindx`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `good_sub` (`num1`, `num2`) VALUES
(1001,    12),
(1001,    13);


Meer uitleg hier :

https://www.mysqltutorial.org/mysql-generated-columns/


Toevoeging op 03/02/2021 13:38:18:

Nog meer uitleg :

https://dev.mysql.com/doc/refman/8.0/en/alter-table-generated-columns.html

Toevoeging op 03/02/2021 13:41:32:

En nog meer :
https://mariadb.com/kb/en/generated-columns/
 
Ozzie PHP

Ozzie PHP

03/02/2021 13:42:29
Quote Anchor link
Maak je toevallig gebruik van PHPMyAdmin? Zo ja, dan kun je dat daar gewoon eenvoudig mee instellen.
 
Snelle Jaap

Snelle Jaap

03/02/2021 14:32:33
Quote Anchor link
Ozzie PHP op 03/02/2021 13:42:29:
Maak je toevallig gebruik van PHPMyAdmin? Zo ja, dan kun je dat daar gewoon eenvoudig mee instellen.


Ja ik gebruik inderdaad phpmyadmin. Hoe kan ik dat daar instellen? Met een trigger oid? Ik zou alleen niet weten wat dan in die trigger te zetten.

Toevoeging op 03/02/2021 15:07:12:

Ik heb geprobeerd deze trigger toe te voegen:

UPDATE orders SET NEW.order_id = CONCAT(NEW.account_id, '.', NEW.ID)

Maar dan krijg ik deze foutmelding wanneer ik een insert probeer:

Can't update table 'orders' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Gewijzigd op 03/02/2021 14:47:59 door Snelle Jaap
 
Ivo P

Ivo P

03/02/2021 15:08:54
Quote Anchor link
even terug naar de oorspronkelijke vraag.

Je wilt daar in een "id" kolom zowel het klantnummer als een order-teller opslaan?

Maar ik hoop dat je het klantnummer ook los zult opslaan in een een kolom klant_id of iets dergelijks met een Foreign Key relantie naar de klanten-tabel?

Want als je strakt moet gaan zoeken in de tabel op "de id kolom begint met '1234.'" dan wordt dat in een rap tempo bijzonder traag.

Voor het tonen van ordernummers kan het inderdaad wel leuk zijn dat je klantenservice met 1 blik op het ordernummer weet dat het om klant 33 of 1234 gaat, maar het is niet nodig om dat in je tabel al direct op te nemen.
Dat kun je achteraf combineren, of al dan niet via een trigger of met bovengenoemde tabel-definitie regelen bij het opslaan.

Maar intern kan jouw order best id 329283982 hebben. En als je dat dan toont als 33.1003 omdat in klant-id de waarde 33 staat en je ergens anders bepaald hebt dat 1003 er ook bij hoort, dan zal dat werken.
Maar probeer dan niet om die 33 uit een varchar veld te moeten grabbelen om alle orders te vinden.
 
Adoptive Solution

Adoptive Solution

03/02/2021 15:09:14
Quote Anchor link
Voor de gelegenheid even PHPMyAdmin geïnstalleerd.

Als je een column toevoegt, staat uiterst rechts de optie 'virtualiteit'.
Je kunt daar dan een formule invullen.

Kijk bij een bestaand veld van het eerder gegeven voorbeeld hoe dat eruit ziet.
 
Ivo P

Ivo P

03/02/2021 15:10:47
Quote Anchor link
qua trigger:

BEFORE INSERT
en dan iets als
IF NEW.order_id is NULL
THEN SET NEW.order_id = (NEW.account_id, NEW.ID)
END IF
 
Snelle Jaap

Snelle Jaap

03/02/2021 15:16:03
Quote Anchor link
@Ivo, ja ik sla die informatie ook los op zoals je aangeeft. Het lijkt me mooi als alle data gewoon in de database gelijk goed staat in plaats van dat ik via PHP later dingen moet gaan combineren zoals ik het wil.
 
Ivo P

Ivo P

03/02/2021 15:24:08
Quote Anchor link
maar bedenk ook wat je je op je hals haalt als je afgeleide data ook opslaat:

Wat als iemand bedenkt dat je in plaats van 33.1000 toe liever 33-1000 op je factuur ziet?
Wat als een order om een of andere reden omgezet wordt van klantnummer 88 naar klantnummer 33 omdat hij er achter kwam dat er al een account was van hem?

Je kunt trouwens ook een VIEW overwegen voor je (afgeleide) data.
 
Ozzie PHP

Ozzie PHP

03/02/2021 15:30:42
Quote Anchor link
Snelle Jaap op 03/02/2021 14:32:33:
Ozzie PHP op 03/02/2021 13:42:29:
Maak je toevallig gebruik van PHPMyAdmin? Zo ja, dan kun je dat daar gewoon eenvoudig mee instellen.


Ja ik gebruik inderdaad phpmyadmin. Hoe kan ik dat daar instellen? Met een trigger oid? Ik zou alleen niet weten wat dan in die trigger te zetten.

Ik heb wellicht te snel gelezen. Ik dacht dat je vraag was hoe je een autoincrement op een kolom moet instellen.

>> 33 is het id van de gebruiker, en 1000 is het aantal orders

Als ik je goed begrijp wil je in 1 en dezelfde kolom het id van de gebruiker opslaan en het totaal aantal van alle aanwezige orders?

WAt hebben die 2 met elkaar te maken, en waarom zou je die in 1 kolom opslaan? Graag wat meer uitleg.
 
Snelle Jaap

Snelle Jaap

03/02/2021 15:36:38
Quote Anchor link
@ozzie Ik heb beide waardes los maar wil ze graag samengevoegd opslaan in een derde kolom. Mijn tabel `orders` heeft nu als eerste een auto increment veld `id` en een veld `account_id` ik wil graag bij elke insert beide samenvoegen in de kolom `order_id` als volgt: id.account_id dus bijv: 33.1002. Zodat ik die overal kan gebruiken in facturen, mails order tabellen etc zonder dat ik keer op keer die waardes in php moet samenvoegen.

Ik weet dat het kan maar de vraag was dus even hoe.
 
Ivo P

Ivo P

03/02/2021 15:40:27
Quote Anchor link
Dat hoef je trouwens niet in PHP samen te voegen, dat kan ook in de query (die je een beetje centraal hebt staan en niet 10x verspreid door 7 scripts)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
SELECT id, klant_id, aantal, what, ever, CONCAT(klant_id, '.', getal) AS geformateerdnummer
FROM tabel


Maar dan zou je ook in een view kunnen doen.
Ik heb het idee dat de waarde 1000 ook niet ergens vastligt, maar nog berekend moet worden.
(iets als "aantal regels in een zekere tabel" + 1000 ?)
 
Snelle Jaap

Snelle Jaap

03/02/2021 15:43:42
Quote Anchor link
Nee de autoincrement begint bij 1000 dus vandaar. Die telt automatisch op.
 
Ozzie PHP

Ozzie PHP

03/02/2021 15:44:40
Quote Anchor link
Ah oké ...

Ik denk dat je nu iets wil gaan doen wat niet echt handig is.

Stel ik ben klant 1 en jij bent klant 500. We plaatsen allebei een order. Eerst jij, dan ik. De ordernummers worden nu:

500.1000
1.1001

Ik heb mijn order later geplaatst, maar mijn ordernummer is kleiner.

Wat jij wil lijkt me niet handig.

Doe je dit in eigen beheer of in opdracht van iemand?
 
Snelle Jaap

Snelle Jaap

03/02/2021 15:50:54
Quote Anchor link
In eigen beheer. En je hebt gelijk maar dat is geen probleem.
 
Ozzie PHP

Ozzie PHP

03/02/2021 16:04:31
Quote Anchor link
>> En je hebt gelijk maar dat is geen probleem.

Dat mag jij denken, maar denk je ook dat de Belastingdienst het geen probleem vindt als jouw ordernummers niet op normale wijze oplopen? Je combineert 2 dingen met elkaar die niks met elkaar te maken hebben.

Dat mag hè ... het is jouw systeem. Alleen wijs ik je er nu alvast op dat het niet verstandig is. Of jij daar iets mee doet, is aan jou.
 
Snelle Jaap

Snelle Jaap

03/02/2021 16:16:53
Quote Anchor link
Het gaat er bij de belastingdienst om dat het nummer oplopend is wat met bovenstaande ook het geval is. Wat er voor de punt staat maakt niet uit.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.