SQL構文のツールチップSQL Prompt--はNOT NULL列を追加またはNOT NULLカラムが空に質問かもしれ作ります

SQLプロンプトのSQL構文は便利なツールチップです。これは、選択のための適切なコードをユーザに提供するために、自動的にデータベースオブジェクト名の構文、及びコードセグメントを検索します。特に便利な開発者がスクリプトに精通していない場合 - 設定された自動スクリプトが読むために、コードが容易になります。使用するのに必要なSQLプロンプトインストール、大幅に符号化効率を向上させることができます。また、ユーザーは、それが意図的に動作させるために、必要に応じてカスタマイズすることができます。

この記事では、既存のテーブルにNULL値が含まれている非空の行または列を追加することで問題を説明して発生する可能性のある非空を変更することができます。移行スクリプトでそのような変化の安全な展開を示しています。

あなたは、テーブルへの変更が満たされたとき作る一般的な儀式であるNULL制約を追加または削除するデータベースの設計では、しかし、いくつかの問題があり、あなたが痛みを感じさせるかもしれません。あなたは、新規または既存の列の許容できない変更のNULL値はNOT NULL列として空の列ことができ追加しようとすると、このような状況が発生することがあります。SQLは、検出されたプロンプトのデフォルト値を指定せずに、警告は、あなたに(EI028)が発行されるコードの既存のテーブルにNOT NULLカラムを追加しようとした場合。

私は、あなたが変更するスクリプトを構築し、これらのタイプのためのアプリケーションを開発する方法を示し、これらの質問のデモンストレーションを行います。私はあなたがテーブルの新しいバージョンを構築するためにゼロから始めているかどうか、仕事にどのようにそれらを表示、または変更、またはあなたはそれがこれらの変更が含まれるように既存のテーブルを更新する必要がある場合でしょう。

NOT NULLは、充填したカラムをテーブルに追加しました

我々は、我々は計算のために古いウェールズ語の単語を記録CountingWordsをテーブルを持っています。私たちの目標は、20に計算するのであるが、唯一の10にカウントする方法を知っています。

/ *我々は、テーブルを作成します。ただ、この例のために、私たちは言葉作成
古いウェールズに1から10までカウントするために使用します。
(ナ、NID wyf YN siaradwr Cymraeg OND rwy'n hoffi gwneud  
rhywfaint O ymchwil ieithyddol gyda'r NOS)
私も最終的には11から20までやってみたい
ので、私はそれらを追加し、NULL、それらを残しておきます。
ここでは、ガード条項との初期ビルドスクリプト、です
もちろん。私たちは、それが実行されるたびに再作成します。 
それは一度だけ実行されるように、いくつかの変更で、私たちはそれを作ることができ  
、あなたのショップで無謀な同僚を持っている場合は、より安全です。
 * / 
IF OBJECT_ID( 'dbo.CountingWords')NULLのDROP TABLEのdbo.CountingWordsではありません。
カウント単語の私達のテーブルの--weスクリプトバージョン1
表dbo.CountingWordsをCREATE 
  ( 
  NULL NOT TheValue INTを、
  ワードNVARCHAR(30)NULL、
  CONSTRAINT CountingWordsPK PRIMARY KEY(TheValue) 
  )。
GO 
INSERT INTO dbo.CountingWords(TheValue、ワード)
VALUES 
  (1、 '未')、(2 'ダウ')、(3 'トライ')、(4 'Pedwar')、
  (5 'ポンプ' )、(6 'Chwech')、(7 '言う')、(8 'Wyth')、
  (9 'Nawは')、(10 'DEG')、(11、NULL)、(12 、NULL)、
  (13、NULL)、(14、NULL)、(15、NULL)、(16、NULL)、
  (17、NULL)、(18、NULL)、(19、NULL)、(20、NULL ); 
GO

リスト1:国連、ダウ、トライ - 初版でCountingWordsテーブル

表の最初のバージョンのリリース後、我々はすぐに私たちは本当に私たちは列にNULLを受け入れないTheLanguageを追加するために設計テーブルを変更し、言語の名前を記録しなければならないことに気づきました。

表dbo.CountingWordsをALTER TheLanguage NVARCHAR(100)NOT NULLを追加します。

SQL Prompt立刻警告我们危险:

20word-image.png

如果我们忽略SQL Prompt的警告并执行此操作,我们将会得到一个错误。

消息4901,级别16,状态1,行34 

ALTER TABLE仅允许添加可以包含空值的列,或者指定了DEFAULT定义,或者添加的列是标识或时间戳列,或者如果没有以前的列条件满足表必须为空以允许添加此列。列'TheLanguage'不能添加到非空表'CountingWords',因为它不满足这些条件。

错误消息是显式的,可以通过定义DEFAULT约束来轻松修复,以便SQL Server可以为每一行插入此新列的默认值。

ALTER TABLE dbo.CountingWords ADD TheLanguage NVARCHAR(100) NOT NULL
          DEFAULT 'Old Welsh';

清单2:添加NOT NULL列时指定默认值

简而言之,如果要添加列,并且不允许NULL值,则必须提供一个值以放入每一行。因为我们的表现在只有一种语言,“老威尔士语”,这不是太难。

当然,我们也想记录如何计算其他语言,例如Manx、Cornish或Cumbrian,因此为了强制执行一些数据完整性,我们需要创建一个名为“Location定义每种语言的父表” ,以及它们的最初记录。

让我们把它弄出来。对于这个表,我们不能只丢弃并重新创建没有数据丢失的表,一旦我们的CountingWords表通过FOREIGN KEY约束引用该表,我们就会得到一个错误。我们需要采取预防措施。如果重新运行代码,我将使用一种简单但相当奇怪的技术,确保在数据丢失方面没有损坏。此脚本必须作为多个批处理运行,因为CREATE TABLE语句必须位于批处理的开头,并且很难跨批处理有条件地执行代码。

IF Object_Id('dbo.Location') IS NOT NULL SET NOEXEC ON;
 --cunning way of only executing a section
--of code on a condition. until the next SET NOEXEC OFF
--we script version 1 of our table of counting words
GO
--sadly the create table statement has to be at the start of a batch
CREATE TABLE dbo.Location
  (
  TheLanguage NVARCHAR(30) NOT NULL,
  Description VARCHAR(100) NOT NULL DEFAULT '',
  CONSTRAINT LanguageKey PRIMARY KEY (TheLanguage)
  );
--now we insert the row we need for our existing data
INSERT INTO dbo.Location (TheLanguage) VALUES ('Old Welsh');
GO
SET NOEXEC OFF;

清单3:Location表的版本1

当然,现在我们还需要修改CountingWords表,使其TheLanguage列为a FOREIGN KEY,引用新Location表,但我们稍后会处理它。

更改可空列以使其不可为空

很快,我们决定允许列中的NULL值是我们想要解决的设计错误。我们已经了解到,如果表包含数据,SQL Server将不允许我们使列不可为空,除非我们为它提供默认值,在这种情况下只是一个空字符串。

ALTER TABLE CountingWords ADD CONSTRAINT WordConstraint DEFAULT '' FOR Word;
ALTER TABLE CountingWords ALTER COLUMN Word NVARCHAR(30) NOT NULL;

消息515,级别16,状态2,行58 

不能将值NULL插入“Word”列,表'PhilFactor.dbo.CountingWords'; 列不允许空值。更新失败。

该语句已终止。

清单4:尝试使Word列NOT NULL失败

AIEE!我们仍然无法使列不可为空,即使我们告诉SQL Server要为NULL列插入什么!首先,我们必须通过使用默认值更新所有行来显式删除任何现有的NULL值:

UPDATE CountingWords SET Word = DEFAULT WHERE Word IS NULL;
ALTER TABLE CountingWords ALTER COLUMN Word NVARCHAR(30) NOT NULL;

本教程内容尚未结束,敬请期待后续内容~


おすすめ

転載: blog.51cto.com/14467432/2432805