2014-07-21 19 views
7

Đây là những gì cột của tôi trông giống nhưLiquibase: Làm thế nào để thả ràng buộc duy nhất không có tên hạn chế?

 <column name="name" type="VARCHAR(255)"> 
      <constraints nullable="false" unique="true"/> 
     </column> 

Tôi muốn loại bỏ unique=true hạn chế.

Tôi nhìn vào những gì liquibase cung cấp và nó có

<changeSet author="liquibase-docs" id="dropUniqueConstraint-example"> 
    <dropUniqueConstraint catalogName="cat" 
      constraintName="const_name" 
      schemaName="public" 
      tableName="person" 
      uniqueColumns="A String"/> 
</changeSet> 

Bây giờ kể từ constraintName là cần thiết và tôi không có nó, lựa chọn của tôi là gì?

Tôi làm cách nào để có thể thả unique=true bằng cách sử dụng liquibase?

+0

http://www.liquibase.org/documentation/changes/drop_unique_constraint.html – xenteros

Trả lời

-2

Tôi nghĩ rằng đặt cược tốt nhất của bạn là để truy vấn cơ sở dữ liệu schema thông tin của bạn để tìm những gì tên được, sau đó sử dụng để xóa nó với một ChangeLog

này đã làm việc cho tôi:

SELECT `CONSTRAINT_NAME` 
FROM `TABLE_CONSTRAINTS` 
WHERE `CONSTRAINT_TYPE` LIKE 'UNIQUE' 

sẽ này , tất nhiên, trả về mọi tên Hạn chế duy nhất trong db của bạn, nhưng bạn sẽ có thể thu hẹp tìm kiếm của mình từ đó.

+0

Xem câu hỏi này để biết thêm chi tiết: http://stackoverflow.com/questions/5499574/how-to-drop-a-unique-constraint-from-table-column – SteveDonie

+1

Ông đã yêu cầu một giải pháp liquibase. Mọi người đều biết cách hack nó vào cơ sở dữ liệu .... –

1

Bạn có thể thực thi một lệnh SQL như thế này, nhưng nó có thể không hoạt động trên tất cả các cơ sở dữ liệu:

<sql>alter table Person drop unique (name)</sql> 

Nếu có một chỉ số được tạo ra rõ ràng trên cột đó, bạn có thể muốn thả quá:

<sql>alter table Person drop unique (name) drop index</sql> 

Điều này phù hợp với Oracle, các cơ sở dữ liệu khác có thể có một Cú pháp khác.

+0

Tôi không đề nghị sử dụng thuế với câu lệnh sql gốc. Nó gây ra vấn đề về tính di động –

2

Tôi đã kết thúc tạo cột mới để thay thế cột có ràng buộc duy nhất.

<addColumn tableName="TABLE" schemaName="SCHEMA"> 
<column name="NEW_COLUMN" type="TYPE" valueComputed="OLD_COLUMN"></column> 
</addColumn> 

<dropColumn tableName="TABLE" schemaName="SCHEMA" columnName="OLD_COLUMN"/> 

<renameColumn tableName="TABLE" schemaName="SCHEMA" oldColumnName="NEW_COLUMN" newColumnName="OLD_COLUMN"/> 
+0

Đó là cách đúng, nhưng đừng quên di chuyển dữ liệu trước. Vì vậy, bạn sẽ kết thúc như: Thêm cột -> Cập nhật dữ liệu cột -> Thả cột cũ. Tôi nghĩ rằng hành vi này được thực hiện bởi vì nó cũng hoạt động trên cơ sở dữ liệu như DB2, mà không hỗ trợ một tuyên bố cột thay đổi. –

+0

Nó hoạt động cho các DBA có thể thả cột một cách chính xác cùng với các chỉ mục, các khóa ngoại vv MSSQL không phải là một trong số chúng, do đó 'lừa' là phụ thuộc vào DB. –

0

Cách phổ biến là:

  1. Tạo một cột mới
  2. Di chuyển dữ liệu vào cột mới (Cập nhật)
  3. Xóa cột cũ

    <changeSet id="20170711-001" author="yourName"> 
        <addColumn tableName="tableName"> 
         <column name="name2" type="VARCHAR(255)"> 
          <constraints nullable="false" unique="false" /> 
         </column> 
        </addColumn> 
    </changeSet> 
    <changeSet author="yourName" id="20170711-002"> 
        <update tableName="tableName"> 
         <column name="name2" type="varchar(255)" valueComputed="originalColumn"/> 
        </update> 
    </changeSet> 
    <changeSet author="yourName" id="20170711-003"> 
        <dropColumn columnName="originalColumn" tableName="tableName"/> 
    </changeSet> 
    

Nếu bạn muốn đổi tên cột mới như cột gốc cũ chỉ cần lặp lại các bước này bằng cách thay đổi tên cho các cột.

+0

Có vấn đề gì với vấn đề này? Tại sao downvote .... –

1

Nếu bạn sử dụng postgresql, bạn có thể tìm thấy constraintName bắt buộc trong pgAdmin. Chọn bạn cột, sau đó đi đến tab thứ tư ở bên phải (Tôi tin rằng nó sẽ được gọi là "phụ thuộc", hoặc một cái gì đó tương tự)

enter image description here

Như bạn có thể thấy, trong trường hợp của tôi constraintName là "public.external_message_storage_message_external_uuid_key "Sau đó, chỉ cần thực hiện

<changeSet author="me" id="dropping constraint"> 
     <dropUniqueConstraint constraintName="external_message_storage_message_external_uuid_key" 
          schemaName="public" 
          tableName="external_message_storage" 
          uniqueColumns="message_external_uuid"/> 
    </changeSet> 
Các vấn đề liên quan