sql >> Databáze >  >> RDS >> Sqlserver

Obousměrné omezení cizího klíče

"Domnívám se, že to není možné. Nemůžete vytvořit záznam adresy, dokud neznáte ID dané osoby, a nemůžete vložit záznam osoby, dokud neznáte AddressId pro pole PrimaryAddressId."

Na první pohled se toto tvrzení zdá být TAK přitažlivé. Je to však docela příznivé.

Jedná se o velmi běžný druh problému, na který se prodejci SQL DBMS pokoušejí útočit již snad desetiletí.

Klíčové je, že veškerá kontrola omezení musí být „odložena“, dokud nebudou obě vložky hotové. Toho lze dosáhnout různými formami. Databázové transakce mohou nabídnout možnost udělat něco jako „SET odložené kontroly omezení ON“ a máte hotovo (nebýt skutečnosti, že v tomto konkrétním příkladu byste si pravděpodobně museli velmi tvrdě pohrát s vaším návrhem abychom mohli pouze DEFINOVAT dvě omezení FK, protože jedno z nich prostě NENÍ 'skutečný' FK ve smyslu SQL!).

Řešení založená na spouštění, jak jsou zde popsána, dosahují v podstatě stejného účinku, ale jsou vystavena všem problémům údržby, které existují s integritou vynucenou aplikací.

Chris Date a Hugh Darwen ve své práci popisují, co je imo skutečným řešením problému:vícenásobné zadání. To je v podstatě možnost sestavit několik různých aktualizačních příkazů a nechat DBMS jednat podle toho, jako by to byl jeden jediný příkaz. Implementace tohoto konceptu existují, ale nenajdete žádnou, která by mluvila o SQL.



  1. Analýza časových razítek - udělat to v MySQL nebo v PHP?

  2. Jak zapnout PostgreSQL VERBOSITY v připojení django db?

  3. Nahrazení \r\n PHP

  4. PostgreSQL:Dočasně deaktivujte připojení