So legen Sie einen Standardwert für eine vorhandene Spalte fest


375

Dies funktioniert in SQL Server 2008 nicht:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

Der Fehler ist:

Falsche Syntax in der Nähe des Schlüsselworts 'SET'.

Was mache ich falsch?


1
Was haben Sie von MSDN ALTER TABLE gelesen ...? msdn.microsoft.com/en-us/library/ms187742(SQL.90).aspx
gbn



1
Das ist MySQL-Syntax.
Benjamin Goodacre

Warum kann sich nicht jeder an einen Standard halten? (Keine wirkliche Frage, alle beziehen sich auf Microsoft und MySQL oder andere Anbieter). Gibt es überhaupt eine Ansi / ISO-Standardmethode?
Joedotnot

Antworten:


566

Dies funktioniert in SQL Server:

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

62
+1 für die Angabe eines Einschränkungsnamens, damit SQL Server keinen zufälligen Namen erstellt.
HardCode

36
MSSQL ist seltsam, wenn es darum geht, Standardwerte als "Einschränkungen" zu bezeichnen. Wenn überhaupt, sind sie Entspannung ; das Gegenteil einer Einschränkung! Sie machen mehr Dinge gültig, nicht weniger.
Roman Starkov

4
Es ist nicht seltsam, wenn Sie auf alternative Weise denken: Die Standardeinschränkung verhindert, dass MSSQL einen Fehler auslöst, wenn Sie die Spalte nicht angeben. Es ist also keine Einschränkung für den Benutzer, sondern eine Einschränkung für MSSQL.
Jonny Piazzi

4
Dies funktioniert nur, wenn für die Spalte keine Standardeinschränkung vorhanden ist.
pmcilreavy

4
@fallenidol Dies funktioniert nur, wenn für die Spalte keine Standardeinschränkung vorhanden ist. Richtig, weil Sie per Definition nicht mehr als einen Standardwert haben können ...
Yuck

165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

3
Dies funktioniert in MSSQL, hat jedoch den Nachteil, dass die Einschränkung, die hinter den Kulissen erstellt wird, nicht benannt wird (siehe die Antwort mit den höheren Stimmen oben).
Contango

10
@Contango Ich denke, es ist besser, sich nicht die Mühe zu machen, jede einzelne Einschränkung zu benennen, wenn Sie eine davon ändern müssen. Schreiben Sie einfach eine Prozedur zum Löschen automatisch benannter Einschränkungen und Sie müssen nie wieder eine benennen + können mit allen anderen unbenannten
umgehen

3
@ Jonny Leeds. Guter Punkt. Ich möchte auch die Einschränkungen benennen, da dies eine gute Dokumentation für alle anderen ist, die versuchen, das Datenbankschema zu ändern (oder einfach zu verstehen). Dies ist weniger wichtig, wenn man als Einzelunternehmer in einem Team von einem arbeitet.
Contango

1
(EESH! Entschuldigung für das Fehlen von Zeilenvorschüben - aus Gründen der Übersichtlichkeit unten eingefügt!) Ich musste es erneut ausführen und fand auf diese Weise, um zu überprüfen, ob es bereits durchgeführt wurde ... WENN EXISTIERT (SELECT * FROM information_schema.columns WHERE) table_name = 'myTable UND column_name =' myColumn UND TABLE_SCHEMA = 'myDBO UND column_default IS NULL) BEGIN ALTER TABLE [myDBO] [myTable] ADD STANDARD 0 FOR [myColumn] END.
Dave

4
Wenn es nur eine Standardeinschränkung gibt ... warum müssen Sie sie benennen? Es sieht so aus, als ob andere Datenbank-Engines eine Syntax zum Hinzufügen, Aktualisieren und Entfernen des Standardwerts für eine Spalte ohne einen anderen Namen als den Spaltennamen bereitstellen, was sinnvoll ist. Der obige Code schlägt übrigens fehl, wenn bereits ein Standard vorhanden ist. Es ist lächerlich, dass SQL Server einen komplexen Join für eine Systemtabelle benötigt, um den Namen der Standardeinschränkung zu ermitteln. Dies sollte nicht erforderlich sein, da eine Spalte nur eine Standardeinschränkung enthalten kann.
Triynko

51

kann die alter column dafür nicht verwenden, benutze stattdessen add

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

9
Ich weiß nicht, warum diese Antwort keine positiven Stimmen bekommt. Es ist genau das gleiche wie das vorher und wurde früher beantwortet ...
spankmaster79

30

Der richtige Weg, dies zu tun, ist wie folgt:

  1. Führen Sie den folgenden Befehl aus:

    sp_help [table name] 
  2. Kopieren Sie den Namen des CONSTRAINT.

  3. Lassen Sie das fallen DEFAULT CONSTRAINT:

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. Führen Sie den folgenden Befehl aus:

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

4
StackOverflow.com ist nur in englischer Sprache. Die portugiesische Seite ist pt.stackoverflow.com
Martin Smith

Dies fügt anderen Antworten nichts Neues hinzu, ist eine manuelle Methode - kann nicht mit Skripten versehen werden und gibt den "richtigen Weg" an.
Andre Figueiredo

12

Hoodaticus 'Lösung war perfekt, danke, aber ich brauchte sie auch, um wieder ausgeführt werden zu können, und fand diesen Weg, um zu überprüfen, ob sie durchgeführt wurde ...

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

Es gibt zwei Szenarien, in denen der Standardwert für eine Spalte geändert werden kann:

  1. Zum Zeitpunkt der Tabellenerstellung
  2. Ändern Sie die vorhandene Spalte für eine vorhandene Tabelle.

  1. Zum Zeitpunkt der Erstellung einer Tabelle / Erstellung einer neuen Spalte.

Abfrage

create table table_name
(
    column_name datatype default 'any default value'
);
  1. Ändern Sie die vorhandene Spalte für eine vorhandene Tabelle

In diesem Fall erlaubt mein SQL Server nicht, den vorhandenen Standardeinschränkungswert zu ändern. Um den Standardwert zu ändern, müssen wir die vorhandene vom System generierte oder vom Benutzer generierte Standardeinschränkung löschen. Danach kann der Standardwert für eine bestimmte Spalte festgelegt werden.

Befolgen Sie einige Schritte:

  1. Listen Sie alle vorhandenen Standardwertbeschränkungen für Spalten auf.

Führen Sie diese Systemdatenbankprozedur aus, wobei der Tabellenname als Parameter verwendet wird. Es gibt eine Liste aller Einschränkungen für alle Spalten in der Tabelle zurück.

execute [dbo].[sp_helpconstraint] 'table_name'
  1. Löschen Sie die vorhandene Standardeinschränkung für eine Spalte.

Syntax:

alter table 'table_name' drop constraint 'constraint_name'
  1. Fügen Sie eine neue Standardwertbeschränkung für diese Spalte hinzu:

Syntax:

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

Prost @!!!


5

Falls bereits eine Einschränkung mit ihrem Standardnamen besteht:

-- 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

Sie können die folgende Syntax verwenden: Weitere Informationen finden Sie in dieser Frage und den Antworten: Fügen Sie einer vorhandenen Tabelle in SQL Server eine Spalte mit einem Standardwert hinzu

Syntax :

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

Beispiel:

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.

Ein anderer Weg :

Klicken Sie mit der rechten Maustaste auf die Tabelle und klicken Sie auf Design. Klicken Sie dann auf die Spalte, für die Sie den Standardwert festlegen möchten.

Fügen Sie dann am Ende der Seite einen Standardwert oder eine Bindung hinzu: etwa '1' für Zeichenfolge oder 1 für int.


3

Gerade gefunden 3 einfache Schritte, um bereits vorhandene Spalte zu ändern, die vorher null war

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

Erste Drop-Einschränkungen

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)

Zweitens Standardwert erstellen

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

2

Versuchen Sie den folgenden Befehl;

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

1

Wie Yucks Antwort mit einem Häkchen, damit das Skript mehr als einmal ohne Fehler ausgeführt werden kann. (weniger Code / benutzerdefinierte Zeichenfolgen als bei Verwendung von 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.