ตามที่รายงานในDatabaseSchema_pgsql :: changeFieldและในdb_change_field () :
หมายเหตุสำคัญ: เพื่อรักษาความสามารถในการพกพาฐานข้อมูลคุณจะต้องสร้างดัชนีและคีย์หลักทั้งหมดที่ใช้ฟิลด์ที่เปลี่ยนแปลงใหม่อย่างชัดเจน
นั่นหมายความว่าคุณต้องวางคีย์และดัชนีที่ได้รับผลกระทบทั้งหมดด้วย db_drop_ {primary_key, unique_key, index} () ก่อนที่จะเรียก db_change_field () หากต้องการสร้างคีย์และดัชนีใหม่ให้ส่งคำจำกัดความของคีย์เป็นอาร์กิวเมนต์ $ new_keys ทางเลือกโดยตรงไปยัง db_change_field ()
ตัวอย่างเช่นสมมติว่าคุณมี:
$schema['foo'] = array(
'fields' => array(
'bar' => array('type' => 'int', 'not null' => TRUE)
),
'primary key' => array('bar')
);
และคุณต้องการเปลี่ยน foo.bar ให้เป็นแบบอนุกรมปล่อยให้มันเป็นคีย์หลัก ลำดับที่ถูกต้องคือ:
db_drop_primary_key($ret, 'foo');
db_change_field($ret, 'foo', 'bar', 'bar',
array('type' => 'serial', 'not null' => TRUE),
array('primary key' => array('bar'))
);
มีการรายงานรหัสที่คล้ายกันสำหรับ Drupal 7
โปรดจำไว้ว่าสำหรับประสบการณ์ของฉันคุณไม่สามารถลบคีย์หลักที่ใช้ฟิลด์อนุกรม ใน Drupal 6 ฉันพบข้อผิดพลาดทุกครั้งที่ฉันลองทำเช่นนั้น ฉันไม่ได้ลองใน Drupal 7
นอกจากนั้นฉันไม่ทราบปัญหาอื่น ๆ ที่คุณอาจมีกับดัชนีฐานข้อมูล
เกี่ยวกับการเพิ่มดัชนีในตารางฐานข้อมูลที่สร้างจากโมดูลอื่นฉันจะไม่แนะนำให้ทำเช่นนั้นเพราะ:
- โมดูลจะไม่ดร็อปดัชนีสำหรับเขตข้อมูลที่มีการเปลี่ยนแปลงหากโมดูลนั้นไม่ได้สร้างดัชนีนั้น มันเป็นไปไม่ได้ที่โมดูลจะทำเช่นนั้นเพราะไม่ทราบชื่อของดัชนี
- การปรับเปลี่ยนตารางฐานข้อมูลที่สร้างโดยโมดูลอื่นนั้นไม่ใช่ความคิดที่ดีแม้แต่ในกรณีที่โมดูลนั้นเป็นโมดูลหลัก หากมีโมดูลอื่นที่เปลี่ยนแปลงตารางเดียวกันโมดูลจะจัดการกับความขัดแย้งที่มีกับแต่ละอื่น ๆ ได้อย่างไรหรือด้วยการเปลี่ยนแปลงโมดูลหลักจะนำไปใช้กับฐานข้อมูลของตัวเองได้อย่างไร
หากตารางฐานข้อมูลถูกสร้างขึ้นจากโมดูลอื่น (โมดูลหลักหรือโมดูลบุคคลที่สาม) ฉันขอแนะนำให้เปิดการร้องขอคุณสมบัติสำหรับโมดูลโดยระบุกรณีการใช้สำหรับการใช้ดัชนีใหม่ หากมีปัญหาด้านประสิทธิภาพใด ๆ การเพิ่มดัชนีอาจเป็นสิ่งที่ต้องทำ
หากคุณกำลังจะเพิ่มดัชนีไปยังตารางที่สร้างจากโมดูลอื่นในเว็บไซต์ของคุณเองให้เตรียมพร้อมสำหรับการเปลี่ยนแปลงใด ๆ ที่คุณต้องทำกับโมดูลที่กำหนดเองของคุณทุกครั้งที่มีการอัปเดตโมดูลและก่อนที่คุณจะติดตั้งในเว็บไซต์ของคุณเอง .
คุณคือผู้ที่สามารถตัดสินใจได้ว่าการทำงานพิเศษนั้นคุ้มค่ากับประสิทธิภาพที่คุณได้รับหรือไม่ โดยส่วนตัวแล้วฉันไม่คิดว่ามันจะคุ้มค่า