Bug 16170: Pseudo foreign key in Items
authorMarcel de Rooy <m.de.rooy@rijksmuseum.nl>
Wed, 23 Mar 2016 15:59:26 +0000 (16:59 +0100)
committerKyle M Hall <kyle@bywatersolutions.com>
Tue, 3 May 2016 15:01:12 +0000 (15:01 +0000)
While many of us would like to get rid of biblioitems one day, the current
scheme includes a biblioitemnumber and a biblionumber in Items.
(Which is not so great..)

But also note that biblionumber is NOT defined as a foreign key in Items,
although a belongs_to relation has been added to the DBIx scheme!
This inconsistency should be resolved. The "remove biblioitem table"
operation is a large one, but in the meantime we better make biblionumber
a regular FK not a 'pseudo' one.

Note: If in an (very) exceptional case biblionumbers are found in items,
that do not exist in biblio, this patch prints a warning at upgrade
time and does not add the constraint.

@RM: Please update the DBIx scheme accordingly.

Test plan:
[1] Run the upgrade. Check if the FK constraint has been added.
[2] Remove the FK constraint. Change the biblionumber of one item to an
    unexisting record. Run the upgrade again. Notice the warning.

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
Tested both cases: constraint added as well as warning printed.

Signed-off-by: Mark Tompsett <mtompset@hotmail.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
installer/data/mysql/atomicupdate/16170_dbrev.perl [new file with mode: 0644]
installer/data/mysql/kohastructure.sql

diff --git a/installer/data/mysql/atomicupdate/16170_dbrev.perl b/installer/data/mysql/atomicupdate/16170_dbrev.perl
new file mode 100644 (file)
index 0000000..7cbfdeb
--- /dev/null
@@ -0,0 +1,25 @@
+my $dbh = C4::Context->dbh;
+my $DBversion = "XXX";
+
+# RM: Copy/paste from here, and uncomment
+
+#if ( CheckVersion($DBversion) ) {
+    # this should normally not be needed, but just in case
+    my ( $cnt ) = $dbh->selectrow_array( q|
+SELECT COUNT(*) FROM items it
+LEFT JOIN biblio bi ON bi.biblionumber=it.biblionumber
+LEFT JOIN biblioitems bii USING (biblioitemnumber)
+WHERE bi.biblionumber IS NULL
+    |);
+    if( $cnt ) {
+        print "WARNING: You have corrupted data in your items table!! The table contains $cnt references to biblio records that do not exist.\nPlease correct your data IMMEDIATELY after this upgrade and manually add the foreign key constraint for biblionumber in the items table.\n";
+    } else {
+        # now add FK
+        $dbh->do( q|
+ALTER TABLE items
+ADD FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE
+        |);
+        print "Upgrade to $DBversion done (Bug 1xxxx - Add FK for biblionumber in items)\n";
+    }
+    #SetVersion($DBversion);
+#}
index a4d6c39..06b9c99 100644 (file)
@@ -1284,7 +1284,8 @@ CREATE TABLE `items` ( -- holdings/item information
   KEY `itype_idx` (`itype`),
   CONSTRAINT `items_ibfk_1` FOREIGN KEY (`biblioitemnumber`) REFERENCES `biblioitems` (`biblioitemnumber`) ON DELETE CASCADE ON UPDATE CASCADE,
   CONSTRAINT `items_ibfk_2` FOREIGN KEY (`homebranch`) REFERENCES `branches` (`branchcode`) ON UPDATE CASCADE,
-  CONSTRAINT `items_ibfk_3` FOREIGN KEY (`holdingbranch`) REFERENCES `branches` (`branchcode`) ON UPDATE CASCADE
+  CONSTRAINT `items_ibfk_3` FOREIGN KEY (`holdingbranch`) REFERENCES `branches` (`branchcode`) ON UPDATE CASCADE,
+  CONSTRAINT `items_ibfk_4` FOREIGN KEY (`biblionumber`) REFERENCES `biblio` (`biblionumber`) ON DELETE CASCADE ON UPDATE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
 
 --