NDExplorer JOIN na sloupce VARCHAR (ne INT)
- rerege
- Člen | 58
Z doku a fóra jsem se dozvěděl, že bez cizích klíčů nemohu použít
Nette Database Explorer – je to tak?
Ale cizí klíč mi nejde založit, neb potřebuji propojit dvě pole typu
VARCHAR(45) ne integer
$importProductsPhotos = $this->database
->table('import_products_photos')
->where('uploaded', '0');
K tomuto potřebuji načíst pole product_id z tab. product
přičemž jediná vazba je product.note1 =
import_products_photos.product_note1
Jde to nějak?
- rerege
- Člen | 58
Ha svitla mi naděje …
Nu, zkouším to udělat v MySQL Workbench a když kliknu na výběr
v referenced Column, tak mi to pole nejde vybrat.
Zatímco třeba ÍDéčka jdou… Došel jsem i po googlení k závěru, že
cizí klíče musí být vždy INT
nemůže to být tím, že vůbec netuším (a tudíž jsem neudělal) INDEXOVÁNÍ ?
Editoval rerege (4. 10. 2017 14:36)
- rerege
- Člen | 58
Tak jsem to(indexy) udělal, ale nepomohlo to… nicméně je pro mě nyní důležité, že vím, že i VARCHAR by mělo jako cizí klíč fungovat. Jdu to zkusit napsat přes SQL editor – třeba mi to hodí nějakou hlášku.
edit: tak hláška Error Code: 1215. Cannot add foreign key constraint
Editoval rerege (4. 10. 2017 14:48)
- rerege
- Člen | 58
mají shodný typ VARCHAR(45) i jsem nyní zkusil vytvořit dvě testovací
tabulky, kde to zkouším…
na stackoverflow píšou tyto podmínky
- Engine should be the same e.g. – InnoDB mám ok
- Datatype should be the same, and with same length. e.g. VARCHAR(20) mám ok
- Collation Columns charset should be the same. e.g. utf8 mám ok
- Unique – Foreign key should refer to field that is unique (usually primary key) mám nastaveno u product.note1
@duke díky pročtu …
- rerege
- Člen | 58
Mááám to …
mě nakonec pomohlo vše smazat a vytvořit postupně znova – někde radili,
nejprve vytvořit rodiče, indexovat, pak tabulku z které jde reference
jinak jde ještě použít tento příkaz: show engine innodb
status
v třetí části logu to napíše daleko více informací, mě to psalo
právě o indexaci… což jsem měl, ale nějak se to nesetkalo
co ještě je prevít, je collection ne na úrovni tabulky, ale na úrovni pole/sloupce
tak snad to někomu pomůže a já jsem zase o něco chytřejší
velmi @CZechBoY a @duke děkuji za pomoc – i díky Vám toto fórum opravdu plní svůj účel!!!
Editoval rerege (4. 10. 2017 19:02)
- rerege
- Člen | 58
Byla by to jednička, nebýt ta chybička…
takováto tabulajzna
CREATE TABLE import_products_photos
(
import_photos_id
int(11) NOT NULL AUTO_INCREMENT,
key_product_note1
varchar(45) COLLATE utf8_czech_ci NOT NULL,
name_photo_file
varchar(45) COLLATE utf8_czech_ci NOT NULL,
thumb
tinyint(4) NOT NULL,
uploaded
tinyint(4) NOT NULL,
PRIMARY KEY (import_photos_id
),
KEY sdfasdf_idx
(key_product_note1
),
CONSTRAINT sdfasdf
FOREIGN KEY
(key_product_note1
) REFERENCES product
(note1
) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
a zmetek mi z tohoto
$importProductsPhotos = $this->database->table('import_products_photos')
->select('import_products_photos.*, product.product_id')
//->ref('key_product_note1')
->where('uploaded', '0');
udělá toto
SELECT import_products_photos
.*,
product
.product_id
,
product
,title
FROM import_products_photos
LEFT JOIN product
ON
import_products_photos
.key_product_note1
=
product
.product_id
WHERE (uploaded
= ‚0‘)
ale klíč je v tab. product navázán na pole note1 a ne na product_id
prosím, co dělám špatně?