NDExplorer JOIN na sloupce VARCHAR (ne INT)

rerege
Člen | 58
+
0
-

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?

CZechBoY
Člen | 3608
+
0
-

Jaktože nemůžeš udělat cizí klíč na varcharu? Nějaká chybová hláška?

rerege
Člen | 58
+
0
-

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)

CZechBoY
Člen | 3608
+
+1
-

Zkus tam přidat indexy, třeba to pomůže. Neznám Workbench tak budu asi jen hádat, chtělo by to spíš projít nápovědu k Workbench.

rerege
Člen | 58
+
0
-

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)

duke
Člen | 650
+
+1
-

Mrkni na tento článek. Třeba tam najdeš odpověď.

CZechBoY
Člen | 3608
+
+1
-

A opravdu mají oba sloupce (zdrojový+cílový) stejný datový typ včetně délky?

rerege
Člen | 58
+
0
-

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
+
0
-

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
+
0
-

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ě?