Como definir um valor padrão para uma coluna existente


375

Isso não está funcionando no SQL Server 2008:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

O erro é:

Sintaxe incorreta perto da palavra-chave 'SET'.

O que estou fazendo errado?


11
O que você leu do MSDN ALTER TABLE disse ...? msdn.microsoft.com/en-us/library/ms187742(SQL.90).aspx
— gbn



11
Essa é a sintaxe do mysql.
— Benjamin Goodacre

por que todo mundo não pode simplesmente seguir um padrão? (não é uma pergunta real, todos se referindo à microsoft e mysql ou outros fornecedores). existe mesmo uma maneira padrão ansi / iso de fazer isso?
— joedotnot 24/01

Respostas:


566

Isso funcionará no SQL Server:

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;

62
+1 para especificar um nome de restrição, para que o SQL Server não crie um nome aleatório.
— HardCode

36
O MSSQL é estranho ao chamar os valores padrão de "restrições". Se alguma coisa, são relaxamentos ; o oposto de uma restrição! Eles fazem mais coisas válidas, não menos.
— Roman Starkov

4
Não é estranho se você pensar de uma maneira alternativa como: A restrição padrão impede que o MSSQL gere um erro se você não especificar a coluna. Portanto, não é uma restrição ao usuário, mas uma restrição ao MSSQL.
— precisa

4
Isso funciona apenas se não houver uma restrição padrão existente na coluna.
— precisa saber é o seguinte

4
@fallenidol Isso funciona apenas se não houver uma restrição padrão existente na coluna. Certo, porque, por definição, você não pode ter mais de um padrão de valor ...
— Yuck

165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

3
Isso funciona no MSSQL, mas tem a desvantagem de não mencionar a restrição que cria nos bastidores (veja a resposta mais votada acima).
— Contango

10
@ Contango Eu acho que é melhor não se incomodar em nomear todas as restrições no momento em que você precisar modificar uma delas. Basta escrever um procedimento para deixar cair restrições nomeados automaticamente e você nunca tem que nomear um novo + pode lidar com todos os outros sem nome
— JonnyRaa

3
@ Jonny Leeds. Bom ponto. Também gosto de citar as restrições, pois é uma boa documentação para qualquer pessoa que tente modificar (ou simplesmente entender) o esquema do banco de dados. Isso é menos importante se for um operador individual trabalhando em uma equipe.
— Contango

11
(EESH! Desculpe pela falta de feeds de linha - colados abaixo para maior clareza!) Eu precisava que fosse executável novamente e encontrei uma maneira de verificar se já havia sido feito ... SE EXISTIR (SELECIONE * DE information_schema.columns WHERE table_name = 'myTable' AND column_name = 'myColumn' AND Table_schema = 'myDBO' AND column_default IS NULL) COMEÇA ALTER TABLE [myDBO]. [myTable] ADICIONAR PADRÃO 0 PARA [myColumn] END
— Dave

4
Se houver apenas uma restrição padrão ... por que você precisa nomeá-la? Parece que outros mecanismos de banco de dados fornecem sintaxe para adicionar, atualizar e remover o valor padrão de uma coluna sem outro nome além do nome da coluna, o que faz sentido. O código acima falhará, se já existir um padrão. É ridículo que o SQL Server exija uma junção complexa em uma tabela do sistema apenas para identificar o nome da restrição padrão, o que não deve ser necessário, pois pode haver apenas uma restrição padrão em uma coluna.
— Triynko

51

não pode usar alterar coluna para isso, use add em vez disso

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn

9
não sei por que essa resposta não recebe votos positivos. É exatamente o mesmo que o anterior e foi respondido mais cedo ...
— spankmaster79

30

A maneira correta de fazer isso é a seguinte:

  1. Execute o comando:

    sp_help [table name] 
  2. Copie o nome do CONSTRAINT.

  3. Solte o DEFAULT CONSTRAINT:

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. Execute o comando abaixo:

    ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]

4
StackOverflow.com é apenas o idioma inglês. O site em português é pt.stackoverflow.com
— Martin Smith

Isso não acrescenta nada de novo para outras respostas, é um método manual - não pode ser programado, e afirma que a "forma correta" ..
— Andre Figueiredo

12

A solução do Hoodaticus foi perfeita, obrigado, mas eu também precisava que fosse executável novamente e encontrei este caminho para verificar se havia sido feito ...

IF EXISTS(SELECT * FROM information_schema.columns 
           WHERE table_name='myTable' AND column_name='myColumn' 
             AND Table_schema='myDBO' AND column_default IS NULL) 
BEGIN 
  ALTER TABLE [myDBO].[myTable] ADD DEFAULT 0 FOR [myColumn] --Hoodaticus
END

7

Há dois cenários em que o valor padrão de uma coluna pode ser alterado,

  1. No momento da criação da tabela
  2. Modifique a coluna existente para uma tabela existente.

  1. No momento da criação da tabela / criação de nova coluna.

Inquerir

create table table_name
(
    column_name datatype default 'any default value'
);
  1. Modificar coluna existente para uma tabela existente

Nesse caso, meu servidor SQL não permite modificar o valor da restrição padrão existente. Portanto, para alterar o valor padrão, precisamos excluir a restrição padrão gerada pelo sistema existente ou gerada pelo usuário. E depois desse valor padrão pode ser definido para uma coluna específica.

Siga alguns passos:

  1. Listar todas as restrições de valor padrão existentes para colunas.

Execute este procedimento de banco de dados do sistema, use o nome da tabela como parâmetro. Ele retorna a lista de todas as restrições para todas as colunas na tabela.

execute [dbo].[sp_helpconstraint] 'table_name'
  1. Solte a restrição padrão existente para uma coluna.

Sintaxe:

alter table 'table_name' drop constraint 'constraint_name'
  1. Adicione nova restrição de valor padrão para essa coluna:

Sintaxe:

alter table 'table_name' add default 'default_value' for 'column_name'

Felicidades @!!!


5

caso já exista uma restrição com seu nome padrão:

-- Drop existing default constraint on Employee.CityBorn
DECLARE @default_name varchar(256);
SELECT @default_name = [name] FROM sys.default_constraints WHERE parent_object_id=OBJECT_ID('Employee') AND COL_NAME(parent_object_id, parent_column_id)='CityBorn';
EXEC('ALTER TABLE Employee DROP CONSTRAINT ' + @default_name);

-- Add default constraint on Employee.CityBorn
ALTER TABLE Employee ADD CONSTRAINT df_employee_1 DEFAULT 'SANDNES' FOR CityBorn;

4
ALTER TABLE [dbo].[Employee] ADD  DEFAULT ('N') FOR [CityBorn]

4

Você pode usar a seguinte sintaxe: Para obter mais informações, consulte esta pergunta e respostas: Adicione uma coluna com um valor padrão a uma tabela existente no SQL Server

Sintaxe:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

Exemplo:

ALTER TABLE SomeTable
ADD SomeCol Bit NULL --Or NOT NULL.
CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is 
autogenerated.
DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

Outra maneira:

Clique com o botão direito do mouse na tabela e clique em Design, depois clique na coluna que deseja definir o valor padrão.

Em seguida, na parte inferior da página, adicione um valor ou ligação padrão: algo como '1' para string ou 1 para int.


3

Acabei de encontrar 3 etapas simples para alterar a coluna já existente que era nula antes

update   orders
set BasicHours=0 where BasicHours is null

alter table orders 
add default(0) for BasicHours

alter table orders 
alter  column CleanBasicHours decimal(7,2) not null 

3

Restrições da primeira gota

https://stackoverflow.com/a/49393045/2547164

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                        WHERE NAME = N'__ColumnName__'
                        AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)

Segundo criar valor padrão

ALTER TABLE [table name] ADD DEFAULT [default value] FOR [column name]

2

Tente seguir o comando;

ALTER TABLE Person11
ADD CONSTRAINT col_1_def
DEFAULT 'This is not NULL' FOR Address

1

Como a resposta de Yuck com uma verificação para permitir que o script seja executado mais de uma vez sem erros. (menos strings de código / customizadas do que usando information_schema.columns)

IF object_id('DF_SomeName', 'D') IS NULL BEGIN
    Print 'Creating Constraint DF_SomeName'
   ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
END
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.