Hi

Ik werkte in het verleden met tabellen via een prefix. Nu zou ik deze tabellen willen samenvoegen met een id van herkomst of iets dergelijks.

Hoe pak ik dit het beste aan?
Sowieso de kleinste tabellen toevoegen aan de grootste lijkt me het beste. maar de gelinkte id's moeten wel volgen natuurlijk.

Ik kan natuurlijk zelf een conversie doorvoeren via "record per record" en de links verbeteren maar werken via insert from lijkt me toch sneller en efficienter.

#bron w3schools
INSERT INTO table2 (column1, column2, column3, ...)
SELECT column1, column2, column3, ...
FROM table1
WHERE condition;


Jan
Ivo P op 03/09/2021 22:06:29

kun je geen mysqldump gebruiken?

nee :(

Ad Fundum op 03/09/2021 20:23:48

Als er geen record bestaat waar naar verwezen kan worden, is het gebruikelijk om in de kolom met de FK-contraint een NULL te zetten. Dat is geen probleem voor de FK-constraint, die controleert alleen maar of de waarde waar naar verwezen wordt bestaat, als er überhaupt een waarde is opgegeven.
Aannemende dat 0 de niet-bestaande waarde is, kan je kiezen om 0 toe te voegen in de andere tabel, of 0 te vervangen voor NULL.

Spijtig genoeg is er maar 1 null.
Ik heb 0,-1 en -2



Als die redenen in alle tabellen hetzelfde zijn hoef je daar niets aan te veranderen, of mis ik iets?
Mocht je het moeten veranderen, dan zou het beter zijn om een tabel te maken, bijvoorbeeld

-- PostgreSQL is even het enige dat ik paraat heb
CREATE SEQUENCE "tegenstander_id_seq";
GRANT USAGE ON SEQUENCE TO PUBLIC;
CREATE TABLE "tegenstander" (
  "id" bigint NOT NULL DEFAULT nextval('tegenstander_id_seq'::regclass),
  "naam" text NOT NULL DEFAULT E'',
  PRIMARY KEY ("id")
) WITH (OIDS=FALSE);
COMMENT ON TABLE "tegenstander" IS 'Aanwezigheid tegenstander';
COMMENT ON COLUMN "id" IS 'ID';
COMMENT ON COLUMN "naam" IS 'Naam';
INSERT INTO "tegenstander" ("id", "naam") VALUES
(-2, 'vrijwillig niet spelen'),
(-1, 'geen tegenstander'),
( 0, 'afwezig');
ALTER TABLE "<mijn tabel>" ADD FOREIGN KEY "<naam fk>" 
  REFERENCES TO "tegenstander MATCH SIMPLE 
  ON UPDATE CASCADE ON DELETE RESTRICT;
GRANT ALL ON "tegenstander" TO PUBLIC;
Ik heb deze gewoon toegevoegd. dus dat probleem opgelost.
Echter iets bizar nu

ALTER TABLE strips_reeksen ADD CONSTRAINT FK_031 FOREIGN KEY (kleurder) REFERENCES strips_kleurders (nummer) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE strips_reeksen ADD CONSTRAINT FK_032 FOREIGN KEY (schrijver) REFERENCES strips_schrijvers (nummer) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE strips_reeksen ADD CONSTRAINT FK_033 FOREIGN KEY (tekenaar) REFERENCES strips_tekenaars (nummer) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE strips_reeksen ADD CONSTRAINT FK_034 FOREIGN KEY (uitgever) REFERENCES strips_uitgeverij (nummer) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE strips_strips ADD CONSTRAINT FK_035 FOREIGN KEY (reeksnr) REFERENCES strips_reeksen (reeksnr) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE strips_subtitels ADD CONSTRAINT FK_036 FOREIGN KEY (id) REFERENCES strips_strips (uniek) ON DELETE CASCADE ON UPDATE CASCADE;

Ik voeg deze commando's in via phpMySql. Geen foutmelding maar toch staan ze niet in de lijst met constraints.
SELECT
    TABLE_NAME,
    COLUMN_NAME,
    CONSTRAINT_NAME,
    REFERENCED_TABLE_NAME,
    REFERENCED_COLUMN_NAME
FROM
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
	REFERENCED_TABLE_SCHEMA = 'janr_be'
ORDER BY 
	KEY_COLUMN_USAGE.CONSTRAINT_NAME ASC

Van de 103 nu lukken enkel deze 6 niet. Sommige anderen gaven ook wel fouten maar dat lag aan de database/mij :)
Misschien was het schema verkeerd?
Je kunt het schema ook nog vermelden bij het aanmaken van de constraints:

ALTER TABLE janr_be.strips_reeksen
  ADD CONSTRAINT janr_be.FK_031 FOREIGN KEY (kleurder)
  REFERENCES janr_be.strips_kleurders (nummer)
  ON DELETE CASCADE ON UPDATE CASCADE;
Als het schema verkeerd is zou ik toch een foutmelding krijgen?

[size=xsmall]Toevoeging op 05/09/2021 14:05:57:[/size]

Gevonden!
tabellen stonden als MyIsam ipv InnoDB
De tabellen werden aangemaakt vanuit een Windows desktop programma en hier gebeurde dus een foutje.
Eindelijk weer een stapje dichterbij.
Jan R op 05/09/2021 09:54:40
Gevonden!
tabellen stonden als MyIsam ipv InnoDB

Dat is één van die dingen om geen MySQL te willen gebruiken, maar een echte database server zoals PostgreSQL. Nu je toch bezig bent is dit misschien een mooi moment om over te stappen als de hosting het toe laat. Je zult er geen spijt van krijgen.
Op mijn hoosting heb ik deze opties
MRG_MyISAM
CSV
MEMORY
MyISAM
Aria
InnoDB
SEQUENCE

Omdat MyIsam als standaard stond heb ik in het begin dat gebruikt en daarna overgestapt naar InnoDB. Iets installeren zit er niet bij. Is enkel hosting!
Server: janr.be.mysql
Servertype: MariaDB
Serverversie: 10.3.30-MariaDB-1:10.3.30+maria~focal - mariadb.org binary distribution
Protocolversie: 10
Gebruiker: xxxxxxxx
Karakterset van server: UTF-8 Unicode (utf8)

Maar ik dacht dat het vroeger mysql was nu mariaDB

Jan
Tenzij je nog veel zou willen ontwikkelen, dan kan het lonend zijn om over te stappen naar hosting met PostgreSQL, anders zou ik het gewoon zo laten, met alleen InnoDB als storage engine.

Reageren