으로는보고 DatabaseSchema_pgsql :: changeField 과의 db_change_field () :
중요 참고 : 데이터베이스 이식성을 유지하려면 변경된 필드를 사용하는 모든 인덱스와 기본 키를 명시 적으로 다시 작성해야합니다.
즉, db_change_field ()를 호출하기 전에 db_drop_ {primary_key, unique_key, index} ()를 사용하여 영향을받는 모든 키와 인덱스를 삭제해야합니다. 키와 색인을 다시 작성하려면 키 정의를 선택적 $ new_keys 인수로 db_change_field ()에 직접 전달하십시오.
예를 들어, 다음이 있다고 가정하십시오.
$schema['foo'] = array(
'fields' => array(
'bar' => array('type' => 'int', 'not null' => TRUE)
),
'primary key' => array('bar')
);
foo.bar를 serial로 변경하여 기본 키로 남겨두고 싶습니다. 올바른 순서는 다음과 같습니다.
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에서는 시도하지 않았습니다.
그 외에도 데이터베이스 인덱스와 관련하여 발생할 수있는 다른 문제는 없습니다.
다른 모듈에서 작성된 데이터베이스 테이블에 색인을 추가하는 방법에 대해서는 다음과 같은 이유로 권장하지 않습니다.
- 모듈 자체가 해당 색인을 작성하지 않은 경우 모듈은 변경중인 필드에 대한 색인을 삭제하지 않습니다. 인덱스의 이름을 모르기 때문에 모듈이 그렇게 할 수 없습니다.
- 모듈이 핵심 모듈 인 경우에도 다른 모듈에서 만든 데이터베이스 테이블을 수정하는 것은 좋은 생각이 아닙니다. 동일한 테이블을 변경하는 다른 모듈이있는 경우 모듈이 서로 충돌하거나 코어 모듈이 자체 데이터베이스에 적용 할 수있는 변경을 어떻게 처리 할 수 있습니까?
데이터베이스 테이블이 다른 모듈 (핵심 모듈 또는 타사 모듈)에서 작성되는 경우 새 색인을 사용하는 사용 사례를 제공하여 모듈에 대한 기능 요청을 열 것을 제안합니다. 성능 문제가있는 경우 인덱스를 추가하는 것이 좋습니다.
다른 모듈에서 작성된 테이블에 색인을 자신의 사이트로 추가하려는 경우, 모듈이 업데이트 될 때마다 그리고 자신의 사이트에 설치하기 전에 사용자 정의 모듈에 대한 변경 사항을 준비하십시오. .
추가 작업이 성능면에서 가치가 있는지 여부를 결정할 수있는 사람은 귀하입니다. 개인적으로, 나는 그것이 가치가 있다고 생각하지 않습니다.