LogicException Table ‘xyz’ does not have a primary key
- H0w4rd
- Člen | 96
Čas od času se mi na produkci stává, že se objeví tahle chyba.
Padá to na příkazu
$this->database->table('xyz')->get(1);
Opravdu nic z tohodle nepomáhá: https://forum.nette.org/…-primary-key
Já vím, že je to takové podezřelé, že si řeknete, že jsem určitě udělal něco špatně, ale jsem si na 100% jistý, že se připojuju na správnou databázi a že ta tabulka na 100% má nastavený PK na sloupečku ID INT primary key not null auto_increment.
Jediné, co pomůže, přelejt data z databáze pryč a nalejt je tam zpátky. Pak smažu nette cache a pak to zase několik hodin funguje.
To mi řekněte, co tam může být za problém.
OS: Debian 8
Databáze MariaDB 10.1
Tabulka je v InnoDB.
I v době, kdy to hází tu chybu, je tabulka normálně čitelná v sql klientovi, lze do ní insertit, měnit záznamy, mazat, vše bez problémů.
Jenom Nette má problém.
- H0w4rd
- Člen | 96
Nestihl/zapomněl jsem napsat.
V NTDB není bug (alespoň ne v tomhle směru). Pátral jsem v kódu Nette, kdy to hází tuhle exception a jak to zjišťuje PK v tabulce – koneckonců daný příkaz je vidět i v laděnce při prvním načtení stránky po smazání cache.
Takže až bude zase někdo pátrat po téhle chybě, nechť si dá příkaz:
SHOW FULL COLUMNS FROM xyz
;
A tam uvidí ve sloupci Key, jestli tam opravdu je PK nebo ne – musí v některém řádku být PRI.
V našem případě se z nějakého záhadného důvodu občas ztratí
v tabulce primární klíč i většina indexů. Nevíme proč. Asi bug
MariaDB 10.1, vůbec bych se tomu nedivil.
SQL klient mi pořád ukazuje, že tam ty klíče jsou, ale on to asi bere
z INFORMATION_SCHEMA, takže je to matoucí.