リレーショナルデータベース研究ノート

この記事は、概念、mysql、sqlserverの3つの部分に分かれています。

part1コンセプト

第1章はじめに

4つの概念:
データ:Data Express
データベース:データベースロジスティクスウェアハウス
データベース管理システム:DBMSウェアハウス全体の運用
データベースシステム:DBSロジスティクスシステム全体
概念モデル:ER図
楕円:属性
長方形:エンティティ
ダイヤモンド:連絡先
1:N:1対多
N:N:多対多
論理物理モデル:
階層モデル:ツリー
ネットワークモデル:グラフ
リレーショナルモデル:2次元テーブル
リレーション:1テーブル
タプル:1行
属性:1列
コード:タプルの属性セットは次のようになります。一意に決定され、その適切なサブセットはコードではありません(複数の属性をコードとして使用できます)
候補コード:非常に小さなスーパーコードセット、その適切なサブセットのいずれもスーパーコードではなく、スーパーコード
マスターコードです:マスターコードは、リレーションシップ内の異なるタプルを区別するための1つの候補コードで使用されるように選択されます
ドメイン:属性値の範囲
コンポーネント:セル値
リレーションモード:リレーションシップの説明
整合性制約:
エンティティの整合性:メインコードは一意であり、null以外
参照整合性:外部コードまたは空、または別のテーブルのマスターコード。
ユーザー定義の整合性:ユーザー定義の
3レベルモードおよび2レベルイメージ:
アプリケーション-n:1-外部モード-外部モード/モードイメージn:1
モード(つまり、論理モード))モード—内部モード/モードマップ1:1—内部モード—1:1—
データの独立性:
論理的独立性:モード構造が変更された
場合、論理的独立性を維持するために外部モード/モードイメージのみを変更する必要があります。物理的独立性:内部モード構造が変更された場合、物理的独立性を維持するためにモード/内部モードイメージのみを変更する必要があります。

第2章:リレーショナルデータベース

リレーション:テーブル
リレーションの説明:R(U、D、DOM、F)
R:リレーション名
U:すべての属性名
D:属性が
DOMから取得されたドメイン
属性とドメインのマッピングF:属性
間の依存関係操作:
クエリ操作の追加、削除、変更、チェック:選択、射影、結合、除算、結合、差分、交差、デカルト製品
関係データ言語:関係代数言語、関係代数言語、SQL言語
関係代数言語:
および:私はあなたまたはあなたを持っています持っている
:同じ
違いをとる:私が持っていないものをとる
カルテシアン製品:私のタプルのそれぞれをあなたのタプルのそれぞれと組み合わせる
選択:コンポーネントが設定範囲内にあるタプル。
投影:選択列。
接続:
ナチュラル接続:共通。属性は等接続であり、破棄されたタプルはフローティングタプル
(完全)外部結合と呼ばれます:自然結合に基づいて、さらに左右のテーブルのフローティングタプルに
基づいています左外部結合:に基づいて自然結合の場合、左側のテーブルを追加します(タプルの右側のテーブル属性が空です)
右側の外部結合:自然な接続に基づいて、右側のテーブルのタプル(タプルの左側のテーブル属性が空です) )
分割:図に示すように

第3章:SQL

ストレージファイル-基本的なテーブルビュー

SELECT ... select
define CREATE、DROP、ALTER ... create、delete、modify
view VIEW、schema SCHEMA、table TABLE、index INDEXをチェックし、モードとビューは変更をサポートしていないことに注意してください
。INSERT、UPDATE、DELETEを操作してください。 ..挿入、更新、削除
Control GRANT、REVOKE ...右

第4章:セキュリティ

ユーザーID認証:静的パスワード、動的パスワード、生体認証、スマートカード
アクセス制御
自律アクセス制御方法
承認:許可の付与と取り消しの回復

表示メカニズム(使用されていない場合は非表示)
監査(すべての操作レコード、違法性があるかどうかを確認)
データ暗号化(プレーンテキストと暗号文)

第5章:完全性

整合性:データの正確性と互換性
3つの主要な整合性:エンティティ、参照、ユーザー定義の
ユーザー定義の整合性:空ではないNOT NULL、列の値は一意であるUNIQUE、特定の条件を満たす式CHECK
アサーションアサーション:一般的な制約を指定するアサーションが真でない場合は拒否されます。
トリガー:リレーショナルテーブルでユーザーが定義した特別なイベント駆動型プロセスをビューで定義することはできません

第6章:リレーショナルデータベース理論

問題があります:データの冗長性、異常な挿入/削除/更新(複数のテーブルに共通の属性があります)
関数従属性:
XはYから導出でき、YはXに属し、X-> Yは些細な関数従属性です(Xクラス、 Yの学生)
XはYから導出でき、YはXに属していない場合、X-> Yは重要な関数従属性です(Xクラス、教師Y)
XはYから導出できますが、Yは完全に依存していませんXでは、Yは部分的にXに依存しています(X学生番号、姓、Y名)
XはYから導出できますが、Xの適切なサブセットの場合、Yは導出できず、Yは完全に機能的にXに依存します( X学生番号、Y名)
候補コード:属性のセット、すべての属性を推測できますが、適切なサブセットで
F(A-> B、B-> C、D-> E、E-など)のすべての属性を推測することはできません。> D)、ADとAEは候補コード
です。候補トピックのアイデアコードの場合、必ずしも唯一の解決策ではない候補コードに注意してください。左側にのみ表示される必要があり、右側に表示されるだけでなく、左右に表示される必要があります。必ずしも表示される
は限らず
スーパーを試すためのバイコードの候補と見なされる場合がありますサイズ:属性を表すことができます属性セット
候補コード:最小のスーパーコード、候補コードの真のサブセットがすべての属性を推測できるわけではありません。
マスターコード:候補コードの1つをメインコードとして選択します。
メイン属性:候補コードに含まれる
属性はメイン属性ではありません:属性
コードは候補コードに含まれません:メインコードと候補コードをコードと呼びます。
完全なコード:すべての属性は完全なコードであるコードです。
正規化されたパラダイム
1NF:すべての関係パターンは1NFであり、テーブル内に
十分なテーブルはありません2NF:1NFに基づいて、非プライマリ属性の部​​分的な関数従属性はありません。コード。簡単に言えば、
3NFに完全に依存しています。2NFに基づいて、コードに対する非プライマリ属性の転送関数依存性はありません。rely
BCNF:ENFに基づくと、コード部分と伝達関数の依存関係に主な属性はありません。簡単に言えば、主な属性間で完全に直接依存しています。
データ依存性公理システム
反射則:YはXに属し、次にXに属します。Yの
拡張法則を導出できます:XをYに導入でき、次にXZYZ
伝達法則
から導出できます:XYから導出でき、YZから導出でき、XZから導出できます。マージルール:XはYから派生、XはZから派生、XはYZ
から派生疑似伝達ルール:XはYをプッシュし、WYはZをプッシュし、XWはZ
分解ルールをプッシュします。XはYをプッシュし、ZはYに属し、Xはプッシュします。 Z.
質問:最小の関数従属性セットを見つける:Fの各依存性は、他の依存性によって導入することはできません。また、右側は単一要素の
ソリューションである必要があります。冗長かどうかを確認するために1つずつ削除し、答えに注意してください。ユニークではないかもしれない。
モード分解
基準:ロスレス接続性、機能的依存性維持
テストの質問:どのように3NFにデータベースを分解し、ロスレス分解と機能の依存関係を維持するために

第7章:デザイン

需要分析
概念構造設計:ER図、データディクショナリ
論理構造設計:ER図を論理モデルに変換:1対1変換メインコード、1対N変換外部コード、N対Nテーブル
物理構造設計:論理モデルから物理モデルへの変換
データベースの実装:SQLコードの記述
データベースの操作と保守:パフォーマンスのテスト、ダンプ、およびリカバリ

第8章:プログラミング

埋め込みSQL:SQLを他のプログラミング言語に書き込みます(事前にプログラムされた変数関数、メイン関数が再コンパイル
されます)。メイン変数:SQLで使用されるメイン言語によって渡される変数名前(あることに注意してください)
。ストレージSQL実行結果のバッファー
動的SQL:実行
中にSQL句を決定し、動的SQLプロシージャーを使用しますSQL:基本ブロック構造
定義部分:DECLARE変数、定数、カーソル、例外
実行部分:BEGIN:SQLステートメント、プロシージャーSQLプロセス
制御ステートメント:EXCEPTION END
ストアドプロシージャと関数の例外処理部分は、前者には戻り値がなく、後者には
ODBCプログラミングが必要であることを除いて、同様です。

第9章:リレーショナルクエリと最適化

代数的最適化:最初に選択と射影を行い、最後に接続を行います

第10章:回復技術

トランザクション:レベル1 SQLステートメント
A.原子性アクトム:すべてを実行するか、まったく実行しないか
。C一貫性:データ間の関係は変更されません。I
分離分離:トランザクションの実行は他のトランザクションによって妨害されません
。D永続期間:永続的な変更、ディスクへの書き込み
トランザクションの失敗:
内部:REDOおよびUNDOテクノロジの採用
システム:再起動、未完了のUNDO、トランザクションの損失REDO
メディア:ハードウェアの修復、データベースの再インストール、REDO完了したトランザクション
ウイルス:アンチウイルス
リカバリテクノロジ:
データダンプ:再-失敗したトランザクションを実行します。
ログファイル:トランザクションの更新操作ファイルをデータに記録します
。チェックポイントを使用したリカバリ

第11章:同時実行制御

問題の原因:
変更の損失:私が読んだ、彼が読んだ、私が変更した、彼が変更した、私の変更が失われた
ダーティデータを読む:彼が変更した、私が読んだ、彼がロールバックした、ダーティデータを読んだ(後で
読むときに異なる値に相当)繰り返し不可の読み取り:私はそれを読み、彼はそれを変更し、そして私はそれを再び読みました。私が読んだ2つの値は異なっていました。
解決策:
排他的ロック=書き込みロック= Xロック
共有ロック=読み取りロック= Sロック
最初に-失われた変更を解決するためのレベルロックアウトプロトコル:変更が終了するまでXロックを追加します。
ダーティデータの読み取りを解決するための第2レベルのロックアウトプロトコル:読み取り時にSロックを追加し
、非繰り返し可能な読み取り:読み取り最後までSロックを追加
Livelock:ロックは永久に待機し、ロックする機会はありません(優先度の低い飢餓状態で死にます)
デッドロック:複数のロックが互いに待機し、誰も互いにロックしません。
シリアル化可能なスケジューリング:同時スケジューリング特定の時間の結果は、シリアルスケジューリングと一致します。
ブロックサイズが大きく、同時実行性が低く、オーバーヘッドが少ない

インデックス

一意のインデックス:2つの行に同じインデックス値を設定することはできません。
主キーインデックス:テーブルに主キーが定義されると自動的に作成されます。これは特殊なタイプの一意のインデックスです。主キーインデックスには、各値が必要です。主キーには、一意の
クラスター化インデックスがあります。テーブル内の行の物理的な順序キー値の論理(インデックス)順序と同じように、テーブルには1つのクラスター化インデックスのみを含める
ことができます(ディクショナリ、ディクショナリ順にソートされ、実装方法にはB / B +ツリーがあり、理論的にはバイナリ検索も可能です)
非クラスター化インデックス:データとインデックスには、データストレージの対応する場所へのポイントが含まれます。テーブル内の行がキー値の論理順序と一致しません
(マップとして理解できます。テーブル内の頻繁にアクセスされるデータアドレスの一部がキー値として使用され、キーマップが生成されます。キーを検索します毎回)
その中で、クラスター化インデックスは非クラスター化インデックスよりも高速であり、テーブルは1つのクラスター化インデックスしか持つことができませんが、複数の非クラスター化インデックスが存在する可能性があります

キー

最初:明確な概念、キー、コード、1つの意味、
次に:スーパーキー/スーパーコード、候補キー/候補コード、主キー/マスターコード
スーパーキー(スーパーキー):内のタプルを一意に識別できる属性セット関係はリレーショナルモードのスーパーキーと呼ばれます
候補キー:冗長な属性を含まないスーパーキーは候補キーと呼ばれます
主キー:ユーザーがタプル識別子として選択した候補キープログラム主キー

たとえば、次の4つの属性(重複する名前がないと仮定):IDカード名、性別、年齢

IDは一意であるため、唯一のスーパーキー
(ID、名前、名前)であり、唯一のスーパーキー
(ID、名前、性別)であるため、唯一のスーパーキー
(ID、名前、性別、年齢)です。 )、つまりスーパーキーです
名前は一意であるため、スーパーキー
(名前、性別)は一意であるため、スーパーキー
(名前、性別、年齢)は一意であるため、スーパーキーです

IDカードは一意であり、冗長な属性がないため、候補キーです。
名前は一意であり、冗長な属性がないため、候補キーです。

ユーザーとして、2つの候補キーのいずれかを主キーとして選択します。たとえば、IDカードが主キーです。

主属性:候補キーの属性

6つのパラダイム

最初の正規形:すべての関係rの属性はアトミック項目であり、分割できません。
例:名前phone ...次に、電話には自宅の電話と携帯電話がある場合がありますが、そうではありません。

2番目の正規形:Rは1NFであり、各非プライマリ属性は完全に候補に依存します。
例:学生ID、コースID、学年...学年は候補者キー(学生ID、コースID)によって異なり、次の
ように準拠します:学生ID、コースID、学年、学生名...学生名のみ主な属性の学生IDに依存し、存在します部分的に依存し、一貫性がありません

3番目の正規形:Rは2NFであり、非プライマリ属性は候補キーワードに推移的に依存しません。
例:従業員ID、スーパーバイザーID、スーパーバイザーの年齢...スーパーバイザーの年齢はスーパーバイザーIDに依存し、スーパーバイザーIDは従業員IDに依存しますが、一致しません

BCNF:Rは3NFであり、主要な属性間に推移的な依存関係はありません。
例:倉庫ID、保管品目ID、管理者ID、数量...(倉庫ID)→(管理者ID)、(管理者ID)→(倉庫ID)が満たされていません

4番目の正規形:RはBCNFであり、テーブルには多対多の関係はありません。
例:従業員ID、従業員の電話、従業員の携帯電話...電話と携帯電話は互いに独立しています。複数の電話と複数の携帯電話が存在する可能性があるため、従業員ID-番号-番号タイプである必要があります(それ以外の場合は、 1つのIDに3つの電話があります)3つの携帯電話、保存するには9行が必要です)

5番目の通常の形式:Rは4NFであり、最終的な構造から元の構造を再確立します。
例:従業員ID、従業員の電話、従業員の携帯電話(電話と携帯電話の両方が一意であると想定)...従業員ID-従業員の電話と従業員ID-従業員の携帯電話に分解する必要があります

トランザクションの特性

原子性(自己比較):トランザクション内のステートメントは分離できません。
一貫性(自己比較):トランザクションは、データベースをある一貫性のある状態から別の一貫性のある状態に変換する必要があります(原子性と同様)。
分離(水平比較):マルチスレッドの場合環境では、1つのスレッドのトランザクションが他のスレッドのトランザクションによって妨害されることはありません(シリアル化可能)。
永続性(垂直比較):トランザクションがコミットされると、保存されます。


part2 mysql

Mysql 查询

select 
{ * | [ distinct ] [ table. ] col [ as name ] [ , [ table1. ] col1 [ as name1 ] , … ] }	
from table [ , table1 , … [ on search_condition ] ]
[ where search_condition ]
[ group by col [ , col1 , … ] ]	
[ having search_condition ]	
[ order by order_expression { asc | desc } [ , order_expression { asc | desc } ]
[ limit m,n ]
[ union [ all ] select … ]

补充:
col部分:可以进行+,-,*,/,%等运算,注意只可以数字相加
可以进行max(col),min(col),avg(col),sum(col),count(col)聚合运算
		char(10)=’yyyy-mm-dd’时,可以使用year(col),month(col),day(col)调用
		timestamp等价于int(14),等价于DATE_FORMAT(col,'%Y%m%d%H%i%s')
		可以使用isnull(col)建列,col为空是1,非空为0
		可以使用nullif(col,val) 建列,col列中值为val的取空,非val取原值
into部分:可以把查询到的内容建成新表
from部分:可以定义要查询的源表,也可以是select子句返回的表
			可以使用left join左外连接,第一个表全部行保留,第二个表只保留匹配行
			可以使用right join右外连接,第二个表全部行保留,第一个表只保留匹配行
			可以使用full join全外连接,两个表都全部行保留,未匹配行全是null
			可以把一个表定义为两个别名,使用自连接
			可以使用cross join交叉连接(笛卡尔乘积)
where部分:可以使用col <,<=,>,>=,=,!=,<>(同!=),可接select子句
				符号可以连接不同的表,若两表同属性名则col部分的列要注明表名
可以使用col [ not ] between … and …
			可以使用not(写在条件前),and,or(三个条件优先级下降)
			可以使用col [ not ] in ( val1 , val2 , val3, … ) 或 val in ( col1 , col2 , col3 , … )
			可以使用col [ not ] like ‘_[a][^b-z]%’( _单符含中文 %全符 []指定 [^]非 )
	可以进行max(col),min(col),avg(col),sum(col),count(col)聚合运算
			可以使用ltrim(col),rtim(col),trim(col),去掉空格
			可以使用clo is [ not ] null
			可以使用[ not ] exists ( select语句) 选择符合条件的行
			可以使用all操作符:<all是小于最小的,>all是大于最大的,=all返回空
			可以使用any操作符:<any是小于最大,>any是大于最小,=any同in
			可以使用some操作符:同any
Group by 部分:可以指定按哪些列分组(可以多列),在col部分可以用count(*)统计
			虽然null不等于null,但是分组中null会分成一组
having部分:类似where定义限制条件,但是其中的聚合函数如AVG只统计组内数据
order by部分:默认asc或1升序,降序设desc或-1,或者用RAND()随机数排序
limit部分:limit m,n可以写成limit n offset m
union部分:连接两个表(列属性名要相同),有all会保留重复值,没有则自动删重复值

执行顺序:from, where, group by, having, select, order by, limit, union, …



Mysql 数据库

创建数据库
create database database_name;
删除数据库
drop database database_name ;



Mysql数据表

创建数据表
create table table_name as select语句
create table table_name ( col1 type , col2 type , … [ condition ] )
	type可以使用int, float, varchar(x), text,其中text可视为无限长的varchar,即x无穷大
	condition可以使用default default_value,设置默认值
condition可以使用primary key,列值必须唯一且不允许有空值
condition可以使用unique,列值必须唯一但允许有空值
condition可以使用not null,不允许有空值
condition可以使用check ( check_condition ),condition例如col>10 and col<20
修改数据表
alter table table_name add col_name type [ condition ]
	增加列
alter table table_name alter column col_name type [ condition ]
	改变列的数据类型
alter table table_name add primary key ( col )
	添加主键(原来不能有主键)
删除数据表
drop table table_name



Mysql视图

创建视图
create view view_name [ ( column_name ) ] as select … [ with check option ] ;
	创建时有with check option字段,则之后通过视图进行数据操作时要也符合定义时的查询条件。
查询视图
select col from view_name;
删除视图
drop view view_name;

对数据表或视图插入数据
insert into { table_name | view_name } ( col1, col2, … ) values ( val1, val2, … ) [ ( val1, val2, … ) ] ;
	对于允许为空的列可以不赋值;有默认值的属性没有赋值时自动设为默认值,可同时插入多行。
对数据表或视图更新数据
update { table_name | view_name } set col = val [ , col1 = val1 , … ] where search_condition ;
	没where就是整列赋值,where子句可以使用其他select子句
对数据表或视图删除数据
delete from { table_name | view_name } where search_condition ;
	没where就是整列删除,注意删除的是行,不可删列。
truncate table table;
	这个不但删了整个表的元素,而所删数据在事务处理日志中还会做相应记录,还比delete效率高。



MySQL导入导出sql文件

window下
1.导出整个数据库
mysqldump -u 用户名 -p 数据库名 > 导出的文件名
mysqldump -u xxxxx -p yyyyyyyy > wwwwwww.sql
2.导出一个表
mysqldump -u 用户名 -p 数据库名 表名 > 导出的文件名
mysqldump -u xxxxx -p yyyyyyyy zzz > wwwwwwww.sql
3.导入数据库(注意sql文件有可能是数据库或表)
source d:/dbname.sql

linux下
一、导出数据库:
mysql的bin目录命令行	mysqldump	-u	用户名	-p	密码	数据库名	>	数据库名.sql
#/usr/local/mysql/bin/   	mysqldump	-u	admin	-p	pass		abcdefg		>	xyz.sql
二、导入数据库
1.当sql文件是一个数据库
mysql	-u	用户名	-p	密码	数据库名	<	数据库名.sql
mysql	-u	admin	-p	pass		abcdefg		<	xyz.sql
2.当sql文件是一个表
(1)选择数据库                    mysql>use abc;
	或者建空数据库				   mysql>create database abc;
(2)设置数据库编码                mysql>set names utf8;
(3)导入数据(注意sql文件的路径) mysql>source /home/abc/abc.sql;



MySQL 连接报错

出现 Authentication plugin 'caching_sha2_password' cannot be loaded
首先登陆,输入密码,然后执行下面四句
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;   #修改加密规则 
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; #更新用户密码 
FLUSH PRIVILEGES;   #刷新权限 
alter user 'root'@'localhost' identified by 'abccba';



Mysql索引

创建索引
CREATE [ UNIQUE ] INDEX indexName ON table_name (column_name)
ALTER table tableName ADD [ UNIQUE ] INDEX indexName(columnName)
删除索引
DROP INDEX [indexName] ON mytable;
ALTER TABLE mytable DROP INDEX indexName;



Mysql存储过程

创建存储过程
DELIMITER $$
USE `shop`$$
DROP PROCEDURE IF EXISTS `proc`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc`()
BEGIN
  SELECT COUNT(*) FROM goods_type;
END$$
DELIMITER ;
	定义时决定传入与传出参数,有in out inout三种,如上例`proc`( in xx integer)
执行存储过程
Call proc_name();
	传入参数a的话就括号里写@a
删除存储过程
Drop procedure proc_name;



Mysql事务

CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci;
USE shop;
CREATE TABLE `account`(
    `id` INT(3) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(30) NOT NULL,
    `money` DECIMAL(9,2) NOT NULL,
    PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO account(`name`,`money`) VALUES('A',2000.00),('B',10000.00);

SET autocommit = 0;
START TRANSACTION;
UPDATE account SET money=money-500 WHERE `name`='A';
UPDATE account SET money=money+500 WHERE `name`='B';
COMMIT;
ROLLBACK;
SET autocommit=1;



part3SQLサーバー

SQL server存储过程

/*创建*/
CREATE PROCEDURE CRE_PRO AS SELECT * FROM brand WHERE cat_name='生鲜食品'
/*执行*/
EXEC CRE_PRO
/*系统存储过程*/
EXEC sp_helptext CRE_PRO
EXEC sp_depends CRE_PRO
EXEC sp_help CRE_PRO
/*修改*/
ALTER PROCEDURE CRE_PRO AS SELECT name,cat_name,cat_id FROM brand WHERE cat_name='运动户外'
/*删除*/
DROP PROCEDURE CRE_PRO



SQL server索引

创建索引
CREATE [UNIQUE] [CLUSTERED|NUNCLUSTERED] //是否唯一索引,是聚类还是非聚类存储
    INDEX 索引名                           //索引名
        ON 表名(属性列……)                  //要生成索列的属性列
            [WITH FILLFACTOR = x]           //生成的索引占总条目的百分比,一般小于30%
使用索引:自动使用
删除索引
DROP INDEX 表名.属性名

举例:
create unique clustered
	index xxx
		on yyy(zzz)
			with fillfactor=30
select * from yyy 
	where zzz 
		between 40 and 60
drop index yyy.xxx




SQL server游标

DECLARE add_cur CURSOR FOR SELECT * FROM user_address	/*声明游标*/
OPEN add_cur                         					/*打开游标*/
FETCH NEXT FROM add_cur            /*执行取数操作*/
WHILE @@fetch_status = 0         	/*判断是否可以继续取数,0成功,非0失败*/
BEGIN								/*while begin … end 是固定搭配*/
  FETCH NEXT FROM add_cur			/* 循环主体就是读取下一行 */
END
CLOSE add_cur                      	/*关闭游标*/
DEALLOCATE add_cur                	/*释放游标*/



SQL server事务

/*启动隐式事务模式*/
SET IMPLICIT_TRANSACTIONS ON
INSERT INTO goods_type VALUES(34,'雪地鞋')
INSERT INTO goods_type VALUES(35,'护手霜')
COMMIT TRANSACTION --提交事务
/*下面的INSERT语句将开始第二个事务*/
INSERT INTO goods_type VALUES(36,'薯片')
SELECT * FROM goods_type
COMMIT TRANSACTION --结束事务
/*关闭隐式事务模式*/
SET IMPLICIT_TRANSACTIONS OFF

BEGIN TRANSACTION UPDATE_DATA
  UPDATE goods SET store_count = 900 WHERE goods_id = 106
  DELETE goods WHERE goods_name = '索尼D7200单反相机'
COMMIT TRANSACTION UPDATE_DATA

BEGIN TRANSACTION
INSERT INTO bookpub (书号,书名) VALUES(9,'一基础学Mysql');
SAVE TRANSACTION SavePoint
INSERT INTO bookpub (书号,书名) VALUES(8,'零基础学Oracle');
SELECT 书号,书名,作者 FROM bookpub;

ROLLBACK TRANSACTION SavePoint
SELECT 书号,书名,作者 FROM bookpub;



SQL server触发器

定义:一种特殊类型的存储过程,是一个可回滚的事务
能够:只能应用在特定的表上,对表插入、更新、删除时自动触发
不能:不能直接调用,不能执行IF,WHILE,CASE等语句

操作	inserted表			deleted表
insert	存放新增记录	 
delete						存放被删记录
update	存放更新后的记录	存放更新前的记录

格式:
go
create trigger trigger_name		     	触发器名
	on table_name                   所属表名
		[with encryption]            	是否上锁
			for[delete,insert,update]    操作类型
	as
		do sth                       触发语句
go

例子:当向表Z插值是就会读出该表中z列的值并赋给X,Y变量,再插入到XY表的x,y列中
select * from z                
select * from xy
go
create trigger trig_insert                    
	on z
		for insert
	as
		declare @x varchar(8),@y varchar(8)
		select @x=z,@y=z from inserted
		insert into xy(x,y) values(@x,@y)
go
insert into z(z) values(4)
select * from z
select * from xy
s
开始时:z表的z属性有3,4两个值,xy表的x属性有3一个值,y属性有3一个值
结束时:z表的z属性有3,4,4三个值,xy表的x属性有3,4两个值,y属笥有3,4两个值



SQL SERVER变量(GO语句中的句子视为一个整体执行)

变量声明格式:declare @变量名 类型
变量赋值格式:set @变量名=值
然后就可以应用到where语句中
go
declare @n varchar(100)
set @n =191
select * from goods where cat_id=@n
go


另外可以从表中读数据赋给变量,如下例子
注意若有多个条目,则变量最终的值是最后一个条目中的值
go
declare @id1 varchar(8),@id2 varchar(10)
select @id1=goods_id,@id2=cat_id from goods
select @id1,@id2
go


ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/cj1064789374/article/details/115342173