2014-03-13 74 views
0

我有下面的2個表。他們都有數據。我想修改charge_date從日期到日期時間。 Mysql不允許我這樣做。 我想這樣做,而不會丟棄和重新創建現有的表。改變主鍵列也是另一個表的外鍵 - Mysql

CREATE TABLE `cmpny_charges` (
    `company_id` int(10) unsigned NOT NULL, 
    `charge_id` varchar(45) NOT NULL, 
    `charge_date` date NOT NULL, 
    `charge_amt` double NOT NULL, 
    `chargeholder_id` varchar(20) NOT NULL, 
    `filing_no` int(10) unsigned DEFAULT NULL, 
    `registration_date` date DEFAULT NULL, 
    `srn` varchar(10) DEFAULT NULL, 
    `charge_type` char(1) NOT NULL, 
    `updated_ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `created_ts` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `doc_no` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`company_id`,`charge_id`,`charge_date`), 
    KEY `cmpny_charges_FK_2` (`chargeholder_id`), 
    KEY `cmpny_charges_FK_1` (`filing_no`), 
    CONSTRAINT `cmpny_charges_FK_2` FOREIGN KEY (`chargeholder_id`) REFERENCES `chargeholder_dtls` (`chargeholder_id`), 
    CONSTRAINT `cmpny_charges_FK_3` FOREIGN KEY (`company_id`) REFERENCES `company` (`company_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `cmpny_charge_dtls` (
    `company_id` int(10) unsigned NOT NULL, 
    `charge_id` varchar(45) NOT NULL, 
    `charge_date` date NOT NULL, 
    `modification_part` text, 
    `part_property_charged` text, 
    `filing_date` datetime DEFAULT NULL, 
    `srn` varchar(9) DEFAULT NULL, 
    `rate_of_interest` text, 
    `repayment_terms` text, 
    `margin` text, 
    `nature_instrument` text, 
    PRIMARY KEY (`company_id`,`charge_id`,`charge_date`), 
    CONSTRAINT `FK_cmpny_charge_dtls_1` FOREIGN KEY (`company_id`, `charge_id`, `charge_date`) REFERENCES `cmpny_charges` (`company_id`, `charge_id`, `charge_date`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

這是ALTER腳本,我想執行

set foreign_key_checks=0; 
lock tables cmpny_charges write, cmpny_charge_dtls write; 
ALTER TABLE `cmpny_charge_dtls` CHANGE `charge_date` `charge_date` datetime not null; 
ALTER TABLE `cmpny_charges` CHANGE `charge_date` `charge_date` datetime not null; 
unlock tables ; 
set foreign_key_checks =1; 

我得到一個錯誤,當我執行show引擎InnoDB的狀態

國外最新KEY ERROR下面

140313 19:54:03表 的外鍵約束出錯csmart/cmpny_ charge_dtls:被引用表中沒有索引,其中 將包含列作爲第一列,或者 中的數據類型與表中的不匹配。約束:,
約束 「FK_cmpny_charge_dtls_1」 外鍵( 「COMPANY_ID」, 「charge_id」, 「扣款」)參考 「cmpny_charges」( 「COMPANY_ID」, 「charge_id」, 「扣款」)的外鍵索引表是 「PRIMARY」有關正確的外鍵定義,請參見 http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html 。 InnoDB:重命名錶 csmart。到 csmartcmpny_charges失敗!

這些都是警告

  1. 我不知道約束的名字對我來說,他們暫時下降。不同的名稱可能會出現相同的限制。 (我需要更新此數據庫的多個副本)

  2. 我想在不創建臨時表的情況下執行此操作,將數據複製到那裏,然後將它們重命名爲原始表。當多個登錄到同一個數據庫的會話嘗試在同一時間執行相同的操作而使其處於不一致的狀態時,會造成問題。

+0

不完全確定它如何在MySQL中工作,但在SQL服務器中,如果列是主鍵的一部分,則無法對其進行修改。您首先必須刪除主約束,然後更改列,然後再次創建主鍵。 – 2014-03-13 14:34:50

回答

0

添加一個新列,將數據複製到其中。然後修改外鍵以指向新列,然後刪除舊列。

alter table cmpny_charges add charge_date2 datetime; 
update cmpny_charges set charge_date2= charge_date; 

-- (I am used to do this via GUI, sorry...) 
-- drop foreing key 
---modify the primary key 
-- recreate the foreing key 

alter table cmpny_charges drop charge_date; 
相關問題