Vra

Ek stel 'n databasis op met phpMyAdmin.Ek het twee tafels (foo en bar), geïndekseer op hul primêre sleutels.Ek probeer 'n relasionele tabel skep (foo_bar) tussen hulle deur hul primêre sleutels as vreemde sleutels te gebruik.

Ek het hierdie tabelle as MyISAM geskep, maar het sedertdien al drie na InnoDB verander, want ek lees dat MyISAM nie vreemde sleutels ondersteun nie.Almal id velde is INT(11).

Wanneer ek kies die foo_bar tabel, klik die "verwantskapaansig"-skakel, en probeer om die FK-kolomme te stel database.foo.id en database.bar.id, dit sê "Geen indeks gedefinieer nie!" langs elke kolom.

Wat mis ek?

Toeligting/opdatering

Ter wille van eenvoud wil ek aanhou om phpMyAdmin te gebruik.Ek gebruik tans XAMPP, wat maklik genoeg is om my op die PHP/CSS/Javascript te laat fokus, en dit kom met phpMyAdmin.

Alhoewel ek nog nie eksplisiete vreemde sleutels kon opstel nie, het ek wel 'n relasionele tabel en kan aansluitings soos volg uitvoer:

SELECT * 
FROM foo 
INNER JOIN foo_bar 
ON foo.id = foo_bar.foo_id 
INNER JOIN bar
ON foo_bar.bar_id = bar.id;

Dit maak my net ongemaklik dat die FK's nie eksplisiet in die databasis gedefinieer word nie.

Was dit nuttig?

Oplossing

As jy wil phpMyAdmin gebruik te rig verhoudings, wat jy hoef te 2 dinge te doen. In die eerste plek, moet jy 'n indeks op die vreemde sleutel kolom in die verwysing tafel (so foo_bar.foo_id, in jou geval) te definieer. Toe, gaan na verhouding oog (in die verwysing tafel) en kies die verwys kolom (so in jou geval foo.id) en die op werk en op te skrap aksies.

Ek dink vreemde sleutels is nuttig as jy verskeie tafels het wat verband hou met mekaar, in die besonder, jou delete skrifte sal baie kort wees as jy die verwysing opsies korrek ingestel.

EDIT:. Maak seker beide van die tafels het die InnoDB enjin gekies

Ander wenke

phpMyAdmin kan jy vreemde sleutels te definieer met behulp van hul "verhoudings" siening. Maar sedert, MySQL ondersteun net buitelandse beperkings op "INNO DB" tafels, die eerste stap is om seker te maak die tafels wat jy gebruik is van daardie soort.

Om die opstel van 'n vreemde sleutel sodat die PID kolom in 'n tabel met die naam KIND verwys na die ID kolom in 'n tabel met die naam OUER, kan jy die volgende doen:

  1. Vir beide tafels, gaan na die blad bedrywighede en verander hul tipe te "INNO DB"
  2. Maak seker ID is die primêre sleutel (of ten minste 'n geïndekseerde kolom) van die ouer tafel.
  3. In die kind tafel, definieer 'n indeks vir die kolom PID.
  4. By die lees van die blad struktuur van die kind tafel, klik op die skakel "verhouding view" net bokant die artikel "voeg velde".
  5. Jy sal gegee word 'n tafel waar elke ry ooreenstem met 'n geïndekseerde kolom in jou kliënt tafel. Die eerste dropdown in elke ry kan jy kies watter tafel-> KOLOM die geïndekseerde kolom verwysings. In die ry vir PID, kies ouer-> ID van die dropdown en klik op Go.

Deur dit te doen 'n uitvoer op die kind tafel, moet jy sien 'n vreemde sleutel beperking is geskep vir die kolom PID.

Hierdie is 'n opsomming van 'n Wikipedia-artikel.Dit spesifiseer die verskillende tipes verhoudings wat jy in PHPmyadmin kan stipuleer.Ek plaas dit hier omdat dit relevant is vir @Nathan se opmerking oor die opstel van die vreemde sleutels opsies vir "op opdatering/delete" maar is te groot vir 'n opmerking - hoop dit help.

KASKADE

Wanneer rye in die hooftabel (verwys na verwysing) uitgevee word (resp.opgedateer), sal die onderskeie rye van die kind (verwysende) tabel met 'n ooreenstemmende vreemde sleutelkolom uitgevee word (resp.opgedateer) ook.Dit word 'n kaskade-skrap genoem (resp.opdatering[2]).

BEPERK

'n Waarde kan nie opgedateer of uitgevee word wanneer 'n ry in 'n vreemde sleuteltabel bestaan ​​wat die waarde in die verwysde tabel verwys nie.Net so kan 'n ry nie uitgevee word solank daar 'n verwysing daarna is vanaf 'n vreemde sleuteltabel nie.

GEEN AKSIE

GEEN AKSIE en BEPERKING is baie dieselfde.Die belangrikste verskil tussen GEEN AKSIE en BEPERKING is dat met GEEN AKSIE die verwysingsintegriteitskontrole gedoen word nadat u probeer het om die tabel te verander.RESTRICT doen die kontrole voordat jy probeer om die UPDATE- of DELETE-stelling uit te voer.Beide verwysingsaksies tree dieselfde op as die verwysingsintegriteitkontrole misluk:die UPDATE- of DELETE-stelling sal 'n fout tot gevolg hê.

STEL NULL

Die vreemde sleutelwaardes in die verwysingsry word op NULL gestel wanneer die verwysde ry opgedateer of uitgevee word.Dit is slegs moontlik as die onderskeie kolomme in die verwysingstabel nul is.As gevolg van die semantiek van NULL, vereis 'n verwysingsry met NULL'e in die vreemde sleutelkolomme nie 'n verwysde ry nie.

STEL STANDAARD

Soortgelyk aan SET NULL, word die vreemde sleutelwaardes in die verwysingsry ingestel op die kolom verstek wanneer die verwysde ry opgedateer of uitgevee word.

In phpMyAdmin, kan jy Buitelandse sleutel toewys eenvoudig deur sy GUI. Klik op die tafel en gaan na die blad struktuur. vind die verband Kyk op net geloei van tafel (getoon beeld hieronder in).

 betree beeld beskrywing hier

Jy kan die vervalsing sleutel uit die lys boks naby die primêre sleutel toewys. (Sien foto hieronder). en red

 betree beeld beskrywing hier

ooreenstemmende SQL navraag outomaties gegenereer en uitgevoer word.

Vir diegene wat nuut tot die databasis .... en moet 'n bestaande tabel verander. Baie dinge lyk baie simpel te wees, maar daar is altyd iets ... tussen A en B.

Voor enigiets anders, 'n blik op hierdie .

  1. Maak seker dat jy P_Id (ouer ID aan beide ouer en kind tafel).
  2. Natuurlik is dit sal reeds in die ouer gevul. Nie noodwendig in die kind in 'n ware en finale manier. So byvoorbeeld P_Id # 3 (miskien baie keer in die kind tafel sal verwys na oorspronklike P_Id by ouer tafel).
  3. Gaan na SQL blad (ek gebruik phpMyAdmin, moet soortgelyke in ander mense wees) en doen hierdie opdrag:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
    
  4. Klik op kind tafel, as struktuur, uiteindelik op relasionele siening. Klaar jou DB beplanning daar. Daar was 'n lekker antwoord voor hierdie een oor waterval, beperk, ens Natuurlik is dit gedoen kan word deur opdragte ...

Buitelandse sleutel beteken 'n nie eerste kenmerk van 'n tafel referes die eerste kenmerk van 'n ander * in phpMyAdmin * eerste stel die kolom wat jy wil vreemde sleutel stel as 'n indeks

klik dan op VERHOUDING VIEW

daar u kan die opsies te vind om buitelandse sleutel stel

InnoDB kan jy 'n nuwe vreemde sleutel beperking by te voeg om 'n tafel met behulp van ALTER TABLE:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

Aan die ander kant, as MyISAM het voordele bo InnoDB in jou konteks, hoekom sou jy wil vreemde sleutel beperkinge skep nie. Jy kan dit hanteer op die model vlak van jou aansoek. Maak net seker die kolomme wat u wil gebruik as 'n vreemde sleutels soektog verskyn!

Moenie vergeet dat die twee kolomme dieselfde tipe data moet hê.

byvoorbeeld as een kolom is van tipe INT en die ander is van tipe tinyint jy die volgende fout kry:

Fout met die skep vreemde sleutel op [PID kolom] (kyk datatipes)

Stap 1: Jy moet die lyn te voeg: standaard-berging-enjin = InnoDB onder die afdeling [mysqld] van jou MySQL opstelling lêer (my.cnf of my.ini afhangende van jou bedryfstelsel) en die mysqld diens weer te begin. betree beeld beskrywing hier

Stap 2: Nou wanneer jy die tafel te skep wat jy sal die tipe tafel sien is: InnoDB

 betree beeld beskrywing hier

Stap 3: Skep beide ouer en kind tafel. Nou maak die kind tafel en kies die kolom U graag die buitelandse Sleutel het: Kies die indeks Sleutel van Aksie Label soos hieronder getoon.

 betree beeld beskrywing hier

Stap 4: Nou maak die verband View in dieselfde kind tafel van onder naby die Print View soos hieronder getoon.

 betree beeld beskrywing hier Stap 5: Kies die kolom U graag die vreemde sleutel af het as Select die Ouer kolom van die druppel. dbName.TableName.ColumnName

Kies toepaslike waardes vir OP DELETE en OP UPDATE betree beeld beskrywing hier

Van die amptelike MySQL dokumentasie by https : //dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :

  

MySQL vereis indekse op vreemde sleutels en gekla sleutels sodat   vreemde sleutel tjeks kan vinnig wees en nie vereis dat 'n tafel scan.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top