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.