Volledige versie bekijken : Database omzetten naar InnoDB



Lenny'tje
13 October 2010, 19:01
Hallo,

Ik ben redelijk nieuw in de programmeerwereld

Ik heb 4 boeken van PHP&MySQL maar in geen 1 boek staat de uitleg die ik zoek.

Dus dan maar hier:

Ik heb in MySQL een database aangemaakt.

Mijn database heet midyat daar onder staan tot nu toe nog 3 tabellen

tabel 1 = product = alle producten
tabel 2 = categorie = alle categorieën
tabel 3 = prod_per_cat = koppelen van product en categorie

Nu als ik een nieuwe database aan wil maken in MySQL dan kan ik niet kiezen tussen een engin, ik heb 2 selects maar daar kan je enkel het lettertype, of weet ik veel wat het is, aanduiden.

Dus heb ik mijn database maar gewoon aangemaakt.

Nu die database staat in MhyISAM en die wil ik omzetten naar InnoDB omdat je met InnoDB meer voordeel hebt (heb ik hier en daar gelezen).

Ik wil dan prod_per_cat maken dat prod_ID en cat_ID Foreign Keys of zoiets zijn zodat als ik een categorie verwijder ik alle producten die onder deze categorie stonden in 1 keer mee verwijder met on delete restrict.

Hoe doe ik dit? :d (beginner)

Butterflyice
13 October 2010, 23:38
heb je de database struktuur ?
dus hoe de tabellen echt zijn opgebouwd of heb je deze nog niet gemaakt ?

Lenny'tje
20 October 2010, 18:55
Ik heb mijn tabellen al gemaakt.

Mijn database heet Midyat (MhyISAM)

En 3 tabellen:

product: (InnoDB)
prod_ID
p_naam
p_omschrijving
p_klein (kleine prijs)
p_groot (grote prijs)
--------

categorie:(InnoDB)
cat_ID
c_naam
---------

prod_per_cat:(InnoDB)
ppc_ID
prod_ID
cat_ID
-------

Dit zijn mijn 3 tabellen:

In prod_per_cat link ik de producten met de categoriën

Nu wou ik er foreighn keys op zetten (ON DELETE RESTRICT en ON UPDATE CASCADE) maar dit gaat helaas niet...

ik krijg een foutmelding: 1064 en dan staat er dat ik in het handboek moet kijken om mijn syntax goed te schrijven bij ADD FOREIGHN KEY ....

Martijnc
20 October 2010, 20:59
Als je de H toets uit je toetsenbord haalt is het probleem opgelost. Het is FOREIGN en niet FOREIGHN. De storage engine is MyISAM en niet MhyISAM.

Lenny'tje
21 October 2010, 18:31
zo, ik heb het geprobeerd maar helaas is dit probleem nog steeds niet opgelost, ik heb alles netjes na gedaan zoals op deze site staan: http://www.phphulp.nl/php/tutorial/overig/mysql-en-innodb/274/het-leuke-werk-integriteit-behouden/505/ (sorry voor als dit niet mag)

dus ik typ in mijn sql:

ALTER TABLE
`midyat`.`prod_per_cat`
ADD FOREIGN KEY
( cat_ID )
REFERENCES
`categorie` (cat_ID)
ON DELETE RESTRICT
ON UPDATE CASCADE

Is dit juist of moet het op een andere manier gaan?
Zijn er misschien modules die ik moet activeren in wamp server?

Butterflyice
21 October 2010, 19:30
Nee je hoeft niets in wamp in te activeren.



CREATE TABLE prd_p_cat (
ppc_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
prd_id INTEGER UNSIGNED NULL,
cat_id INTEGER UNSIGNED NULL,
PRIMARY KEY(ppc_id)
)
TYPE=InnoDB;
CREATE TABLE categorie (
cat_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
cat_name VARCHAR(100) NULL,
PRIMARY KEY(cat_id)
)
TYPE=InnoDB;
CREATE TABLE product (
prd_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
prd_p_cat_ppc_id INTEGER UNSIGNED NOT NULL,
prd_descrpt VARCHAR(255) NULL,
prd_name VARCHAR(255) NULL,
prd_small_price VARCHAR(255) NULL,
prd_big_price VARCHAR(255) NULL,
PRIMARY KEY(prd_id),
INDEX product_FKIndex1(prd_p_cat_ppc_id),
FOREIGN KEY(prd_p_cat_ppc_id)
REFERENCES prd_p_cat(ppc_id)
ON DELETE CASCADE
ON UPDATE RESTRICT
)
TYPE=InnoDB;


heb ff een paar tabellen gemaakt met FOREIGN key

Lenny'tje
22 October 2010, 19:47
Dus als ik nu die code invoer in mijn sql (nieuwe tabellen in gebruik neem) en als ik dan een categorie verwijder dan zijn automatisch alle producten onder die categorie verdwenen? (zoals ik het wil)

En kan je dan ook je producten appart verwijderen/updaten zonder je een categorie verwijderd?

(ik leer dit maar pas dus ik heb niet zo veel ervaring)

thx in ieder geval voor je voorbeeld en je reacties ;)

Butterflyice
23 October 2010, 09:29
Als je dat wil dan heb je die koppel tabel n iet nodig dan kan je dit afhandelen met een extra row in de tabel van de producten.

Lenny'tje
23 October 2010, 20:00
Ja dat kon ik doen maar. Als ik nu een product onder 2 categorieën wil onder brengen dan moet ik dit product 2x aan maken. Of niet?

thx ;)

Butterflyice
23 October 2010, 23:35
Je gaat nu een probleem opgeven terwijl je eerst de vraag steld
Dus als ik nu die code invoer in mijn sql (nieuwe tabellen in gebruik neem) en als ik dan een categorie verwijder dan zijn automatisch alle producten onder die categorie verdwenen?

met deze vraag neem ik aan dat je alle producten en de categorie wilt verwijderen.


Maar je wilt dus eigenlijk.

Producten behouden als ze nog bestaan in een andere categorie?
Bestaan de producten niet meer in een andere categorie dan mogen ze weg ?
En dan ook los de producten verwijderen los van de categorie ?

Heb ik het zo goed dan weet ik wat ik nog in de tabellen moet aanpassen.

Lenny'tje
24 October 2010, 20:07
Ja zo is het precies.

Sorry dat ik er zo laat nog mee afkwam.

De producten zijn eigenlijk in dit geval gerechten zeg maar en af en toe komt er een gerecht bij, veranderd er een gerecht of er wordt een gerecht geschrapt dus moet die kunnen verwijderd worden.

Als er een categorie met gerechten wordt verwijderd dan moeten al de gerechten onder die categorie ook verwijderd worden behalve als die gerechten nog onder een andere categorie staan.

Zo wil ik het maken. Ik kan het ook met een delete query doen maar dan is die zo geavanceerd en dan zou de kans nog groot zijn dat er nog dingen achter blijven in mijn database, die er eigenlijk niet meer zouden moeten zijn.

Daarom de foreign key ^^

Lenny'tje
26 October 2010, 19:55
Dus hoe moet ik het nu doen?

Ik dacht aan:

Het in product prod_id foreign maken met het prod_ID dat in prod_per_cat staat en cat_ID in prod_per_cat foreign maken met cat_ID in categorie.

Zou dit zo kunnen werken? (enkel die sql wil nooit werken)

Butterflyice
27 October 2010, 20:05
Ik heb helaas maar 2 handen en 1 hoofd ik zal het straks ff voor je uitwerken.

Butterflyice
28 October 2010, 09:05
Als goed is zou dit moeten werken voor je.


CREATE TABLE prd_p_cat (
ppc_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
prd_id INTEGER UNSIGNED NULL,
cat_id INTEGER UNSIGNED NULL,
PRIMARY KEY(ppc_id)
)
TYPE=InnoDB;
CREATE TABLE product (
prd_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
prd_cat_ppc_id INTEGER UNSIGNED NOT NULL,
prd_descrpt VARCHAR(255) NULL,
prd_name VARCHAR(255) NULL,
prd_small_price VARCHAR(255) NULL,
prd_big_price VARCHAR(255) NULL,
PRIMARY KEY(prd_id),
INDEX product_FKIndex1(prd_cat_ppc_id),
FOREIGN KEY(prd_cat_ppc_id)
REFERENCES prd_p_cat(ppc_id)
ON DELETE RESTRICT
ON UPDATE RESTRICT
)
TYPE=InnoDB;
CREATE TABLE categorie (
cat_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
cat_ppc_id INTEGER UNSIGNED NOT NULL,
cat_name VARCHAR(100) NULL,
PRIMARY KEY(cat_id),
INDEX categorie_FKIndex1(cat_ppc_id),
FOREIGN KEY(cat_ppc_id)
REFERENCES prd_p_cat(ppc_id)
ON DELETE RESTRICT
ON UPDATE RESTRICT
)
TYPE=InnoDB;

Lenny'tje
29 October 2010, 16:01
ok thx, waar heb je dit eig geleerd of uit welk boek haal je dit?

Groetjes,

Butterflyice
29 October 2010, 18:34
Ik heb het mij zelf aangeleerd.
En doe het nu welke dag is namelijk mijn werk geworden.

Lenny'tje
30 October 2010, 23:42
tof ^^

Weet jij dan misschien of je met FilleZilla naar je eigen browser kan connecteren?

Ik wil namelijk lees en schrijf rechten op mijn map images zetten want als ik een afbeelding wil verplaatsen naar die mep zegt hij order denied...

Butterflyice
30 October 2010, 23:50
lokaal ?
Heb je windows als besturings system dan kan je op de map staan in en dan alleen lezen uitzetten.
Dan kan je het wel uploaden.

Lenny'tje
31 October 2010, 19:46
Ja naar localhost, maar ik ga nu even proberen om alleen lezen uit te zetten.

Dan kijk ik even of het werkt ^^ thx