Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

सिद्धांत विदेशी कुंजी बाधा अक्षम करें

परिभाषा . द्वारा आप कुंजी को शून्य पर सेट किए बिना उस रिकॉर्ड को हटा नहीं सकते जिसे विदेशी कुंजी इंगित कर रही है (onDelete="SET NULL" ) या डिलीट ऑपरेशन को कैस्केडिंग करना (दो विकल्प हैं - ORM स्तर:cascade={"remove"} | डेटाबेस स्तर:onDelete="CASCADE" )
अभी भी मौजूदा रिकॉर्ड का डिफ़ॉल्ट मान सेट करना , लेकिन आपको इसे मैन्युअल रूप से करना होगा, मुझे नहीं लगता कि सिद्धांत इस "आउट-ऑफ-द-बॉक्स" का समर्थन करता है (यदि मैं गलत हूं तो कृपया मुझे सुधारें, लेकिन इस मामले में डिफ़ॉल्ट मान सेट करना वैसे भी वांछित नहीं है)।

यह सख्ती विदेशी कुंजी बाधाओं की अवधारणा को दर्शाती है; जैसे @ थियो ने कहा:

सॉफ्ट डिलीट (पहले ही उल्लेख किया गया) एक समाधान है, लेकिन आप एक अतिरिक्त removed_page_id भी जोड़ सकते हैं। कॉलम जिसे आप page_id . के साथ सिंक करते हैं इससे पहले कि आप इसे preRemove . में हटा दें ईवेंट हैंडलर (जीवन चक्र कॉलबैक)। क्या इस तरह की जानकारी का कोई मूल्य है मुझे आश्चर्य है लेकिन मुझे लगता है कि आपके पास इसके लिए कुछ उपयोग है, अन्यथा आप यह प्रश्न नहीं पूछते।

मैं निश्चित रूप से यह दावा नहीं कर रहा हूं कि यह अच्छा अभ्यास है , लेकिन यह कम से कम ऐसा कुछ है जिसे आप अपने किनारे के मामले के लिए उपयोग कर सकते हैं। तो कुछ इस पंक्ति में:

आपके Revision . में :

/**
 * @ORM\ManyToOne(targetEntity="Page", cascade="persist")
 * @ORM\JoinColumn(name="page_id", referencedColumnName="id", onDelete="SET NULL")
 */
private $parentPage;

/**
 * @var int
 * @ORM\Column(type="integer", name="removed_page_id", nullable=true)
 */
protected $removedPageId;

और फिर अपने Page . में :

/** 
 * @ORM\PreRemove 
 */
public function preRemovePageHandler(LifecycleEventArgs $args)
{
    $entityManager = $args->getEntityManager();
    $page = $args->getEntity();
    $revisions = $page->getRevisions();
    foreach($revisions as $revision){
        $revision->setRemovedPageId($page->getId());
        $entityManager->persist($revision);
    }
    $entityManager->flush();
}

वैकल्पिक रूप से आप निश्चित रूप से पहले से ही सही $removedPageId . सेट कर सकते हैं आपके Revision . के निर्माण के दौरान मूल्य , तो आपको हटाने पर जीवन चक्र कॉलबैक निष्पादित करने की भी आवश्यकता नहीं है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:प्रोग्रामेटिक रूप से विदेशी कुंजी संबंधों को कैसे निर्धारित करें?

  2. Laravel Eloquent द्वारा प्रबंधित टाइमस्टैम्प (created_at और update_at) के लिए टाइमज़ोन को कैसे अपडेट करें?

  3. अलग-अलग टेबल में एक ही नाम वाले कॉलम को गिनना और ग्रुप करना (जहां केवल एक टेबल से क्लॉज)

  4. MySQL सर्वर mysli PHP का उपयोग करके अद्यतन (विशाल QUERY, लगभग 85MB) पर चला गया है

  5. चेतावनी:mysql_query() पैरामीटर 2 को संसाधन होने की अपेक्षा करता है, बूलियन C:\wamp\www\pyrll\emlhome.php लाइन 15 पर दिया गया है