Ruby on Rails : 마이그레이션을 사용하여 기존 열에 null이 아닌 제약 조건을 어떻게 추가합니까?


130

내 Rails (3.2) 앱에는 데이터베이스에 많은 테이블이 있지만 null이 아닌 제약 조건을 추가하는 것을 잊었습니다. Google에서 검색했지만 기존 열에 null을 추가하지 않는 마이그레이션을 작성하는 방법을 찾을 수 없습니다.

티아.

답변:


93

Rails 4+의 경우, nates의 답변 ( change_column_null 사용 )이 더 좋습니다.

프리 레일 4, change_column을 시도하십시오 .


25
이 접근 방식에주의하십시오-해당 열에 대한 다른 속성 (예 : :limit제약 조건)이있는 경우을 사용할 때 해당 속성을 반복해야합니다 change_column. 그렇지 않으면 속성 이 손실됩니다. 이러한 이유로, 나는 사용하는 것을 선호합니다change_column_null
Nathan Wallace

이것은 IrreversibleMigration원하는 것이 아닐 수도 있습니다.
Nic Nilov

@NicNilov 당신은 답변 또는 Nathan Wallace의 의견에 대해 이야기하고 있습니까?
Mark

@ Mark 대답에 대해 이야기하고 있었지만 구체적이지 않아서 죄송합니다.
Nic Nilov

@NicNilov no dw 나는 단지 두 번 확인하고 싶었지만 :)
Mark

274

change_column_null 을 사용할 수도 있습니다 .

change_column_null :table_name, :column_name, false

8
가장 깨끗한 답변!
Josh 클릭

1
나는 많은 열에 대해 변경해야했고 이것은 각 열에 대해 열 유형을 지정할 필요가 없습니다.
Dorian

1
이것이 더 나은 대답입니다. 데이터베이스에서 기존 null 값이있는 열에 null 제약 조건을 추가하고있었습니다. change_column은 해당 값을 업데이트하지 않습니다. 설명서에 따라 change_column_null에는 업데이트의 새로운 값인 선택적 네 번째 값이 있습니다.
Merovex

고마워 가장 좋은 답변입니다.
Ryan Rebo

1
흥미로운 부작용 .... 마이그레이션을 롤백하면 필드가 반대 (false-> true)로 설정됩니다. 따라서 여러 필드에 대해 마이그레이션을 작성하여 널 제한 조건을 추가하고 일부 필드에 이미 널 제한 조건이있는 경우 마이그레이션을 롤백하면 이미있는 모든 필드에서 널 제한 조건이 제거됩니다.
jpw

10

1) FIRST : 기본값으로 열 추가

2) THEN : 기본값 제거

add_column :orders, :items, :integer, null: false, default: 0
change_column :orders, :items, :integer, default: nil

2
이것은 null이 아닌 새 열을 추가 해야하는 경우 올바른 해결책입니다 .SQLLite가 불만을 표시하므로 기본값이 있음을 먼저 정의해야합니다 (기본값 NULL이 아닌 NOT NULL 열을 추가 할 수 없음).
밀라노

2

새로운 작성 마이그레이션 스크립트 / 스키마에서이를 사용하는 경우이를 정의하는 방법은 다음과 같습니다.

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
    t.string :name, null: false     # Notice here, NOT NULL definition
    t.string :email, null: false
    t.string :password, null: false
    t.integer :created_by
    t.integer :updated_by 

    t.datetime :created_at
    t.datetime :updated_at, default: -> { 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' }
   end
  end
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.