[mysql] add timestamp for insert to query

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Gigazone
  • Registratie: Februari 2008
  • Laatst online: 14-06 19:49
Als (oude) beginner ben ik nog immer aan het knutselen aan een projectje om meer te begrijpen van php, mysql en het maken van websites.

Ik gebruik nu xamp met mysql (mariadb).

Ik voeg via een php script nieuwe EAN nummers toe aan db 'products' vanuit db 'tmp' via onderstaande query


code:
1
2
3
INSERT INTO products (EAN) 
SELECT column13 FROM tmp 
WHERE column13 NOT IN (SELECT EAN FROM products)


Dat werkt prima, nu leek het me handig om ook de timestamp toe te voegen, dus de timestamp van de 1e keer dat de EAN wordt toegevoegd. Dus ik had ondestaande bedacht.

code:
1
2
3
4
INSERT INTO products (EAN) 
SELECT column13 FROM tmp
SET date_added = timestamp() 
WHERE column13 NOT IN (SELECT EAN FROM products)


Nu wordt er een timetamp toegevoegd. MAAR, deze wordt geupdate bij het opnieuw laden, en dat willen we dus niet. Dus blijkbaar is SET niet de juiste syntax, maar moet ik de timestamp meenemen in de INSERT.

Nu kwam ik INSERT INTO.... VALUES... tegen met een aantal voorbeelden. maar in de voorbeelden kwam ik geen select, of timestamp tegen. Dus ik heb onderstaand geprobeerd in allerlei variaties met en zonder brackets, maar ik krijg het niet voor elkaar.

code:
1
2
3
INSERT INTO products (EAN, date_added) 
VALUES (SELECT column13 FROM tmp) , (CURRENT_TIME() ) 
WHERE column13 NOT IN (SELECT EAN FROM products)


Moet ik het zonder brackets doen? of alleen brackets om de select? Of moet de values geheel weg?
:?

Of zit ik compleet op de verkeerd en moet het totaal anders?

Alle reacties


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Schrijf gewoon eerst een SELECT query zoals je de data wil hebben. De timestamp in de select clause zetten is waarschijnlijk wat je wil inderdaad.
Tevreden? Dan pleur je er de INSERT INTO voor. 😊

(Zelfde protip als je data moet verwijderen etc: eerst als select schrijven zodat je enkel rows ziet die weg moeten en dan er pas DELETE van maken.)

{signature}


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Euh, zoals ik je topicstart begrijp heb je dus elke keer dat je de producten gaat bekijken dat je de tmp tabel naar de producten tabel kopieert? Je wil die actie (select ... insert into...) natuurlijk maar eenmalig doen (bij een "import" actie ofzo) en daarna gewoon alleen maar "select ... from ..." gebruiken wanneer je je producten tabel gaat bekijken.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Gigazone
  • Registratie: Februari 2008
  • Laatst online: 14-06 19:49
RobIII schreef op donderdag 25 april 2019 @ 10:34:
Euh, zoals ik je topicstart begrijp heb je dus elke keer dat je de producten gaat bekijken dat je de tmp tabel naar de producten tabel kopieert? Je wil die actie (select ... insert into...) natuurlijk maar eenmalig doen (bij een "import" actie ofzo) en daarna gewoon alleen maar "select ... from ..." gebruiken wanneer je je producten tabel gaat bekijken.
Het betreft ook een import actie. Ik lees een x aantal rijen in een tijdelijke tabel in, en kopieer nieuwe rijen naar de products tabel.

Dus voor het bekijken van producten is de tijdelijke tabel noch het kopieren van data tussen tabellen relevant.

Ik heb tijdens het aanmaken van de db kolom aangegeven dat het een TIMESTAMP kolom is en deze heeft een automatische update bij verandering, vandaar dat deze blijkbaar iedere keer de waarde nieuw was.
Dus nu heb ik het aangepast naar een varchar kolom. Nu kom ik er dus ook achter dat mijn eerste syntax onjuist was en niets toevoegd.
Voutloos schreef op donderdag 25 april 2019 @ 10:07:
Schrijf gewoon eerst een SELECT query zoals je de data wil hebben. De timestamp in de select clause zetten is waarschijnlijk wat je wil inderdaad.
Tevreden? Dan pleur je er de INSERT INTO voor. 😊

(Zelfde protip als je data moet verwijderen etc: eerst als select schrijven zodat je enkel rows ziet die weg moeten en dan er pas DELETE van maken.)
Ik selecteer toch al de data die ik wil (niet dubbele EAN). Theoretisch zou SET dan ook gewoon moeten werken aangezien de query niets zou moeten doen bij dubbele velden. Maar zoals ik al aangaf is mijn syntax daar onjuist. Wellicht dat ik met een variabele moet werken.

Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Gigazone schreef op donderdag 25 april 2019 @ 10:52:
Dus nu heb ik het aangepast naar een varchar kolom.
8)7 Dat is nooit de oplossing. Ik weet niet wat 't probleem nu is (het lijkt erop dat we langs elkaar praten of ik je gewoon niet goed begrijp) maar je "oplossing" is, 100% zeker weten, niet de juiste.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Gigazone
  • Registratie: Februari 2008
  • Laatst online: 14-06 19:49
Sorry voor de verwarring. Het enige wat ik wil een een 'timestamp' toevoegen als een nieuw product wordt toegevoegd.

code:
1
2
3
INSERT INTO products (EAN) 
SELECT column13 FROM tmp 
WHERE column13 NOT IN (SELECT EAN FROM products)


Daaraan moet ik dus toevoegen op welke 'timestamp' het product is toegevoegd. C'est tout.
Dus:

code:
1
2
3
4
INSERT INTO products (EAN) 
SELECT column13 FROM tmp
SET date_added = timestamp() 
WHERE column13 NOT IN (SELECT EAN FROM products)


Maar dan met een werkende syntax voor regel 3. En uit uw reactie begrijp ik dat 'data_added' toch gewoon een Timestamp kolom moet zijn, maar dan niet een die automatisch update.

Acties:
  • 0 Henk 'm!

  • Demonitzu
  • Registratie: Augustus 2012
  • Niet online

Demonitzu

Incidentele gebruiker

Ik weet niet of ik de situatie helemaal snap :p

Zo'n timestamp zou alleen moeten updaten als de db table daarop ingesteld is of als je expliciet de timestamp update bij bv. een UPDATE query.

INSERT INTO moet gepaard gaan met VALUES. Als je daarbij data uit andere tables nodig hebt, dan heb je die SELECT query nodig die tussen () staat

[ Voor 3% gewijzigd door Demonitzu op 25-04-2019 11:27 ]

TekkenZone - Dutch Tekken Community


Acties:
  • +2 Henk 'm!

  • EnnaN
  • Registratie: September 2002
  • Laatst online: 14:34

EnnaN

Toys in the attic

Wil je niet gewoon een timestamp column met een `DEFAULT CURRENT_TIMESTAMP` en dat je het lekker door mysql laat fixen?

sig


Acties:
  • 0 Henk 'm!

  • Gigazone
  • Registratie: Februari 2008
  • Laatst online: 14-06 19:49
EnnaN schreef op donderdag 25 april 2019 @ 11:33:
Wil je niet gewoon een timestamp column met een `DEFAULT CURRENT_TIMESTAMP` en dat je het lekker door mysql laat fixen?
Als er dan een nieuwe rij wordt aangemaakt dan komt er in 'date_added' dus default de 'current timestamp' die nooit meer veranderd (bij opnieuw inlezen ofzo) ? Als dat zo is dan is dat wel een goede oplossing, en waarschijnlijk ook sneller. Ik ga het implementeren en kijken wat er gebeurt.

Acties:
  • 0 Henk 'm!

  • Khallouki
  • Registratie: Oktober 2006
  • Laatst online: 20:32
Gigazone schreef op donderdag 25 april 2019 @ 11:45:
[...]


Als er dan een nieuwe rij wordt aangemaakt dan komt er in 'date_added' dus default de 'current timestamp' die nooit meer veranderd (bij opnieuw inlezen ofzo) ? Als dat zo is dan is dat wel een goede oplossing, en waarschijnlijk ook sneller. Ik ga het implementeren en kijken wat er gebeurt.
De naam zegt het al. DEFAULT CURRENT_TIMESTAMP geeft aan dat als je niks invult bij een insert de huidige timestamp wordt gebruikt.

Bij een update is de kolom al gevuld met een timestamp, die veranderd dus niet meer.

Acties:
  • 0 Henk 'm!

  • Gigazone
  • Registratie: Februari 2008
  • Laatst online: 14-06 19:49
Khallouki schreef op donderdag 25 april 2019 @ 12:08:
[...]
Bij een update is de kolom al gevuld met een timestamp, die veranderd dus niet meer.
Ik dacht toch voor de zekerheid maar eens vragen :) Zo gaat het denk ik wel lukken, thanks guys!

En op naar de volgende uitdaging! :)

Acties:
  • 0 Henk 'm!

Verwijderd

Dat is ook een plossing, volgende keer: insert into products (ean, ...) where ...
Pagina: 1