SQL Server 2000 / SQL Server 2005 හි පවතින වගුවකට පෙරනිමි අගයක් සහිත තීරුවක් එකතු කරන්නේ කෙසේද ?
SQL Server 2000 / SQL Server 2005 හි පවතින වගුවකට පෙරනිමි අගයක් සහිත තීරුවක් එකතු කරන්නේ කෙසේද ?
Answers:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES
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.
වෛකල්පිත සීමාකිරීමේ නම:
ඔබ ඉවත්ව ගියහොත් CONSTRAINT D_SomeTable_SomeCol
SQL සේවාදායකය
පෙරනිමි- ප්රතිවිරෝධයක් ස්වයංක්රීයව උත්පාදනය කරයි.DF__SomeTa__SomeC__4FB7FEF6
විකල්ප ප්රකාශය සමග-සාරධර්ම:
මෙම WITH VALUES
ඔබේ තීරුව Nullable විට පමණයි අවශ්ය වන්නේ
ඔබ අගය දැනට පවතින වාර්තා සඳහා භාවිතා පෙරනිමි ඕන.
ඔබේ තීරුව නම් NOT NULL
, එය
ඔබ සඳහන් WITH VALUES
කළත් නැතත්, දැනට පවතින සියලුම වාර්තා සඳහා පෙරනිමි අගය ස්වයංක්රීයව භාවිතා කරයි .
පෙරනිමි-අවහිරතා සමග ආකාරය ඇතුල් වැඩ:
ඔබ බවට වාර්තා ඇතුල් නම් SomeTable
හා නෑ නෑ නියම SomeCol
ගේ අගය, එසේ නම් ඒ සඳහා ගෙවීම පැහැර හරිනු 0
.
ඔබ වාර්තා ඇතුල් නම් හා නියම SomeCol
ලෙස අගය ගේ NULL
(සහ ඔබගේ තීරුව nulls ඉඩ),
පසුව පෙරනිමි-අවහිරතා ඇත නොහැකි භාවිතා කළ සහ NULL
අගය ලෙස, ඇතුළු වනු ඇත.
සටහන් පදනම් වූයේ පහත දැක්වෙන සියලු දෙනාගේ හොඳ ප්රතිපෝෂණය මත ය.
විශේෂ ස්තූතිය:
at යාට්රික්ස්, al වෝල්ටර්ස්ටබොස්, ah යාහූ සීරියස් සහ @ ස්ටැක්මන් ඔවුන්ගේ අදහස් සඳහා.
NOT NULL
. කරුණාකර මෙය උත්සාහ කරන්න: create table blah(a int not null primary key clustered); insert blah values (1), (2); alter table blah add b int null constraint df_blah_b default (0); select * from blah;
තීරුව සඳහා ඔබට NULL අගයන් 2 ක් පෙනෙනු ඇත b
.
WITH VALUES
පවතින පේළි යාවත්කාලීන කිරීමට භාවිතා කරන්න . MSDN බලන්න : "එකතු කළ තීරුව ශුන්ය අගයන්ට ඉඩ දී WITH VALUES
නිශ්චිතව දක්වා තිබේ නම්, පෙරනිමි අගය නව තීරුවේ ගබඩා කර ඇති අතර පවතින පේළි වලට එකතු වේ."
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO
DEFAULT ඇතුළත් කිරීම දැනට පවතින පේළි වල පෙරනිමි අගය සමඟ තීරුව පුරවන බැවින් NOT NULL අවහිරතා උල්ලං is නය නොවේ.
අහෝසි කළ හැකි තීරුවක් එක් කරන විට , WITH VALUES
පවතින DEFAULT අගය පවතින පේළි වලට යොදන බව සහතික කරයි:
ALTER TABLE table
ADD column BIT -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES
DEFAULT
අවහිරතා සහිත තීරුවකට සැමවිටම වටිනාකමක් ඇතැයි උපකල්පනය කිරීම පහසුය - එනම්, NOT NULL
නිශ්චිතව දක්වා නොමැති වුවද, NULL නොවන්න.
BIT
දත්ත සමුදාය ගැන නොවේ , මම මේ විශේෂිත BIT
තීරුව ගැන කතා කරමින් සිටියෙමි . පිළිතුර දෙස බලන්න, තීරුව ලෙස ප්රකාශයට පත් කෙරේ NOT NULL
.
ALTER TABLE <table name>
ADD <new column name> <data type> NOT NULL
GO
ALTER TABLE <table name>
ADD CONSTRAINT <constraint name> DEFAULT <default value> FOR <new column name>
GO
ඔබට තීරු කිහිපයක් එක් කිරීමට අවශ්ය නම් ඔබට එය මේ ආකාරයෙන් කළ හැකිය:
ALTER TABLE YourTable
ADD Column1 INT NOT NULL DEFAULT 0,
Column2 INT NOT NULL DEFAULT 1,
Column3 VARCHAR(50) DEFAULT 'Hello'
GO
භාවිත:
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
යොමුව: ALTER TABLE (Transact-SQL) (MSDN)
පෙරනිමි අගයක් සහිත පවතින දත්ත සමුදා වගුවකට තීරුවක් එක් කිරීමට, අපට මෙය භාවිතා කළ හැකිය:
ALTER TABLE [dbo.table_name]
ADD [Column_Name] BIT NOT NULL
Default ( 0 )
පෙරනිමි අගයක් සහිත පවතින දත්ත සමුදා වගුවකට තීරුවක් එක් කිරීමට තවත් ක්රමයක් මෙන්න.
පෙරනිමි අගයක් සහිත තීරුවක් එක් කිරීම සඳහා වඩාත් සවිස්තරාත්මක SQL ස්ක්රිප්ට් එකක් පහළින් ඇති අතර එය එකතු කිරීමට පෙර තීරුව තිබේදැයි පරීක්ෂා කිරීම ද අවහිරතා පරීක්ෂා කර එකක් තිබේ නම් එය අතහැර දමයි. මෙම ස්ක්රිප්ටයේ ද අවහිරතා ඇති බැවින් අපට ලස්සන නම් කිරීමේ සම්මුතියක් (මම DF_ ට කැමතියි) ලබා ගත හැකි අතර එසේ නොවේ නම් අහඹු ලෙස ජනනය කරන ලද සංඛ්යාවක් ඇති නමක් සමඟ SQL අපට බාධාවක් ලබා දෙනු ඇත; ඒ නිසා අවහිරතා නම් කිරීමට හැකිවීම සතුටක්.
-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_Emplyee'
AND COLUMN_NAME = 'Column_EmployeeName'
)
BEGIN
IF EXISTS ( SELECT 1
FROM sys.default_constraints
WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
)
BEGIN
------ DROP Contraint
ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
END
-- ----- DROP Column -----------------------------------------------------------------
ALTER TABLE [dbo].table_Emplyee
DROP COLUMN Column_EmployeeName
PRINT 'Column Column_EmployeeName in images table was dropped'
END
--------------------------------------------------------------------------
-- ADD COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_Emplyee'
AND COLUMN_NAME = 'Column_EmployeeName'
)
BEGIN
----- ADD Column & Contraint
ALTER TABLE dbo.table_Emplyee
ADD Column_EmployeeName BIT NOT NULL
CONSTRAINT [DF_table_Emplyee_Column_EmployeeName] DEFAULT (0)
PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
END
GO
පෙරනිමි අගයක් සහිත පවත්නා දත්ත සමුදා වගුවකට තීරුවක් එක් කිරීමට මෙය ක්රම දෙකකි.
ඔබට පහත දැක්වෙන ආකාරයෙන් T-SQL සමඟ එය කළ හැකිය.
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
නිර්මාණ මෙනුවේ දකුණු පස ක්ලික් කිරීමෙන් පෙරනිමි අගය වගුවට සකසා ගැනීමෙන් ඔබට SQL සේවාදායක කළමනාකරණ චිත්රාගාරය භාවිතා කළ හැකිය .
තවද, දත්ත සමුදායේ ඇති සියලුම වගු වලට එකම තීරුව (එය නොපවතී නම්) එක් කිරීමට ඔබට අවශ්ය නම්, භාවිතා කරන්න:
USE AdventureWorks;
EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;
SQL Server 2008-R2 හි, මම සැලසුම් මාදිලියට - පරීක්ෂණ දත්ත ගබඩාවකට ගොස්, නිර්මාණකරු භාවිතා කරමින් මගේ තීරු දෙක එකතු කර GUI සමඟ සැකසුම් සකස් කළෙමි, එවිට කුප්රකට Right-Click" වෙනස් කිරීමේ ස්ක්රිප්ට් උත්පාදනය කරන්න " යන විකල්පය ලබා දෙයි !
නිසි ලෙස හැඩගස්වා ඇති සහතික කළ හැකි වැඩ වෙනස් කිරීමේ ස්ක්රිප්ට් එක සමඟ කුඩා කවුළුවක් දිස් වේ. පහසු බොත්තම ඔබන්න.
විකල්පයක් ලෙස, අවහිරතා පැහැදිලිව නම් නොකර ඔබට පෙරනිමියක් එක් කළ හැකිය:
ALTER TABLE [schema].[tablename] ADD DEFAULT ((0)) FOR [columnname]
මෙම අවහිරතා නිර්මාණය කිරීමේදී පවතින පෙරනිමි සීමාවන් සමඟ ඔබට ගැටළුවක් ඇත්නම් ඒවා ඉවත් කළ හැක්කේ:
alter table [schema].[tablename] drop constraint [constraintname]
මෙය SSMS GUI හි ද කළ හැකිය. මම පෙරනිමි දිනයක් පහතින් පෙන්වන නමුත් පෙරනිමි අගය ඕනෑම දෙයක් විය හැකිය.
(getdate())
හෝ abc
හෝ 0
කරන්න :ALTER TABLE ADD ColumnName {Column_Type} Constraint
MSDN ලිපියේ ALTER TABLE (Transact-SQL) හි සියලුම වෙනස් වගු සින්ටැක්ස් ඇත.
උදාහරණයක්:
ALTER TABLE tes
ADD ssd NUMBER DEFAULT '0';
මෙයට පිළිතුරු රාශියක් ඇත, නමුත් මෙම දීර් extended ක්රමය එකතු කිරීමේ අවශ්යතාවය මට දැනේ. මෙය බොහෝ දිගු බවක් පෙනේ, නමුත් ඔබ සක්රීය දත්ත ගබඩාවක පේළි මිලියන ගණනක් ඇති වගුවකට NULL ක්ෂේත්රයක් එකතු කරන්නේ නම් එය අතිශයින් ප්රයෝජනවත් වේ.
ALTER TABLE {schemaName}.{tableName}
ADD {columnName} {datatype} NULL
CONSTRAINT {constraintName} DEFAULT {DefaultValue}
UPDATE {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
ALTER TABLE {schemaName}.{tableName}
ALTER COLUMN {columnName} {datatype} NOT NULL
මෙය කරන්නේ තීරුව ශුන්ය කළ හැකි ක්ෂේත්රයක් ලෙස එකතු කිරීම සහ පෙරනිමි අගය සමඟ සියලු ක්ෂේත්ර පෙරනිමි අගයට යාවත්කාලීන කිරීම (හෝ ඔබට වඩාත් අර්ථවත් අගයන් පැවරිය හැකිය), අවසානයේ එය තීරුව NULL ලෙස වෙනස් කරයි.
එයට හේතුව ඔබ විශාල පරිමාණ වගුවක් යාවත්කාලීන කර සෑම පේළියකටම ලිවිය යුතු නව ශුන්ය නොවන ක්ෂේත්රයක් එක් කළහොත් එමඟින් තීරුව එකතු කර සියලු අගයන් ලිවීමෙන් මුළු වගුවම අගුළු දමනු ඇත.
මෙම ක්රමය මඟින් ඉතා වේගයෙන් ක්රියාත්මක වන ශුන්ය තීරුව එකතු කරනු ඇති අතර පසුව ශුන්ය නොවන තත්වය සැකසීමට පෙර දත්ත පුරවනු ඇත.
මුළු ප්රකාශයම එක ප්රකාශයකින් කිරීමෙන් අපගේ වඩාත් ක්රියාකාරී වගුවක් මිනිත්තු 4-8 අතර කාලයක් අගුළු දමා ඇති බව මට පෙනී ගොස් ඇති අතර බොහෝ විට මම එම ක්රියාවලිය විනාශ කර ඇත්තෙමි. මෙම ක්රමය එක් එක් කොටස සාමාන්යයෙන් ගත වන්නේ තත්පර කිහිපයක් පමණක් වන අතර අවම අගුලු දැමීමට හේතු වේ.
මීට අමතරව, ඔබට පේළි බිලියන ගණනක වගුවක් තිබේ නම් එය යාවත්කාලීන කිරීම වටී.
WHILE 1=1
BEGIN
UPDATE TOP (1000000) {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
IF @@ROWCOUNT < 1000000
BREAK;
END
මේක උත්සාහ කරන්න
ALTER TABLE Product
ADD ProductID INT NOT NULL DEFAULT(1)
GO
SQL සේවාදායකය + වෙනස් වගුව + තීරුව එක් කරන්න + පෙරනිමි අගය අද්විතීය හඳුනාගැනීමක්
ALTER TABLE Product
ADD ReferenceID uniqueidentifier not null
default (cast(cast(0 as binary) as uniqueidentifier))
IF NOT EXISTS (
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME ='TABLENAME' AND COLUMN_NAME = 'COLUMNNAME'
)
BEGIN
ALTER TABLE TABLENAME ADD COLUMNNAME Nvarchar(MAX) Not Null default
END
NOT EXISTS
වගුව වෙනස් කිරීමට උත්සාහ කිරීමට පෙර මම චෙක්පතට කැමතියි . ඉතා හොඳ විසඳුමක්. මෙය ක්රියාත්මක වන ආකාරය පිළිබඳ අමතර විවරණ කිහිපයක් එය වඩාත් ප්රයෝජනවත් වනු ඇත.
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO
වගුවකට නව තීරුවක් එක් කරන්න:
ALTER TABLE [table]
ADD Column1 Datatype
උදාහරණයක් වශයෙන්,
ALTER TABLE [test]
ADD ID Int
පරිශීලකයාට එය ස්වයංක්රීයව වැඩි කිරීමට අවශ්ය නම්:
ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL
මෙය SQL සේවාදායකය සඳහා වේ:
ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES
උදාහරණයක්:
ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES
ඔබට සීමාවන් එකතු කිරීමට අවශ්ය නම්:
ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES
පහත කේතය මඟින් මෙය කළ හැකිය.
CREATE TABLE TestTable
(FirstCol INT NOT NULL)
GO
------------------------------
-- Option 1
------------------------------
-- Adding New Column
ALTER TABLE TestTable
ADD SecondCol INT
GO
-- Updating it with Default
UPDATE TestTable
SET SecondCol = 0
GO
-- Alter
ALTER TABLE TestTable
ALTER COLUMN SecondCol INT NOT NULL
GO
පහත විමසුම සමඟ උත්සාහ කරන්න:
ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue
මෙය වගුවට නව තීරුවක් එක් කරනු ඇත.
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)
මෙම විමසුමෙන් ඔබට පෙරනිමි අගය 0 සහිත දත්ත සමුදායේ තීරුවක් එක් කළ හැකිය.
හොඳයි, දැන් මගේ පෙර පිළිතුරට යම් වෙනස් කිරීමක් කර ඇත. කිසිම පිළිතුරක් සඳහන් කර නැති බව මම දැක ඇත්තෙමි IF NOT EXISTS
. මේසය වෙනස් කිරීමේදී යම් යම් ගැටලුවලට මුහුණ දී ඇති බැවින් මම එයට නව විසඳුමක් ලබා දීමට යන්නෙමි.
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'TaskSheet' AND column_name = 'IsBilledToClient')
BEGIN
ALTER TABLE dbo.TaskSheet ADD
IsBilledToClient bit NOT NULL DEFAULT ((1))
END
GO
මෙන්න TaskSheet
විශේෂිත වගුවේ නම වන IsBilledToClient
අතර ඔබ ඇතුළු කිරීමට යන නව තීරුව සහ 1
පෙරනිමි අගය වේ. එයින් අදහස් වන්නේ නව තීරුවේ පවත්නා පේළි වල වටිනාකම කුමක් වනු ඇත්ද යන්නයි. කෙසේ වෙතත්, මා භාවිතා කළ තීරු වර්ගයට සාපේක්ෂව ඔබට අවශ්ය පරිදි වෙනස් කළ හැකියBIT
, එබැවින් මම පෙරනිමි අගය 1 ලෙස තැබුවෙමි.
මම ඉහත ක්රමය යෝජනා කරන්නේ මා ගැටලුවකට මුහුණ දී ඇති බැවිනි. ඉතින් මොකක්ද ප්රශ්නය? ගැටළුව වන්නේ, IsBilledToClient
වගුව වගුවේ තීරුව තිබේ නම් ඔබ පහත දැක්වෙන කේතයේ කොටසක් පමණක් ක්රියාත්මක කරන්නේ නම් SQL සේවාදායක විමසුම් සාදන්නාගේ දෝෂයක් ඔබට පෙනෙනු ඇත. නමුත් එය නොපවතී නම් පළමු වරට ක්රියාත්මක කිරීමේදී දෝෂයක් ඇති නොවේ.
ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]