ホームページ > バックエンド開発 > PHPチュートリアル > mysql の高度な使用法、mysql_PHP の高度な使用法チュートリアル

mysql の高度な使用法、mysql_PHP の高度な使用法チュートリアル

WBOY
リリース: 2016-07-13 09:56:47
オリジナル
1023 人が閲覧しました

mysqlの高度な使い方、mysqlの高度な使い方

1.手順:データベースを作成します

CREATE DATABASE データベース名

2. 説明: データベースを削除します

データベース dbname を削除します

3. 手順: SQLサーバーをバックアップします

--- データをバックアップするデバイスを作成します

USEマスター

EXEC sp_addumpdevice 'disk', 'testBack', 'c:mssql7backupMyNwind_1.dat'

--- バックアップを開始します

データベースパブをバックアップして testBack します

4. 手順: 新しいテーブルを作成します

create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

既存のテーブルに基づいて新しいテーブルを作成します:

A: tab_old のようなテーブル tab_new を作成します (古いテーブルを使用して新しいテーブルを作成します)

B: tab_old定義のみからcol1,col2…を選択してテーブルtab_newを作成します

5. 説明: 新しいテーブルを削除します

テーブルのタブ名をドロップします

6. 説明: 列を追加します

テーブルのタブ名を変更し、列の列の型を追加します

注: 列を追加すると、削除することはできません。 DB2 では、列の追加後にデータ型を変更することはできません。変更できるのは、varchar 型の長さを増やすことだけです。

7. 説明: 主キーの追加: Alter table tabname add Primary key(col)

手順: 主キーの削除: Alter table tabname Drop Primary key(col)

8. 説明: インデックスの作成: tabname(col….) に [一意の] インデックス idxname を作成します

インデックスの削除: インデックス idxname を削除します

注: インデックスは変更できません。変更したい場合は、削除して再構築する必要があります。

9. 説明: ビューの作成: select ステートメントとしてビュー viewname を作成します

ビューの削除: ビューのビュー名をドロップします

10. 説明: いくつかの簡単な基本 SQL ステートメント

Select: select * from table1 where range

insert: table1(field1,field2)に挿入するvalues(value1,value2)

削除: table1 where rangeから削除

更新: table1 set field1=value1 where range

検索: select * from table1 where field1 like '%value1%' ---like の構文は非常に洗練されているので、情報を確認してください。

並べ替え: select * from table1 order by field1,field2 [desc]

合計カウント: table1 から totalcount としてカウントを選択します

Sum: table1 の sumvalue として sum(field1) を選択します

平均: table1 の avgvalue として avg(field1) を選択します

最大値: table1 の maxvalue として max(field1) を選択します

最小: table1 の minvalue として min(field1) を選択します

11. 説明: いくつかの高度なクエリ演算子

A:UNIONオペレーター

UNION 演算子は、他の 2 つの結果テーブル (TABLE1 と TABLE2 など) を結合し、テーブル内の重複行を削除することによって結果テーブルを導出します。 ALL を UNION とともに使用する (つまり、UNION ALL) 場合、重複行は削除されません。どちらの場合も、派生テーブルのすべての行は TABLE1 または TABLE2 から取得されます。

B: 演算子を除く

EXCEPT演算子は、TABLE1にはあるがTABLE2には含まれていないすべての行を含め、重複する行を削除することによって結果テーブルを導出します。 ALL を EXCEPT (EXCEPT ALL) とともに使用すると、重複行は削除されません。

C: INTERSECT 演算子

INTERSECT演算子は、TABLE1とTABLE2の両方に存在する行のみを含め、重複する行を削除することによって結果テーブルを導出します。 ALL を INTERSECT (INTERSECT ALL) とともに使用すると、重複行は削除されません。

注: 演算子を使用した複数のクエリ結果行は一貫している必要があります。

12. 手順: 外部結合を使用します

A.左(外側)参加:

左外部結合 (左結合): 結果セットには、結合テーブルの一致する行と左結合テーブルのすべての行が含まれます。

SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

B:右(外側)結合:

右外部結合 (右結合): 結果セットには、結合テーブルの一致する結合行と右結合テーブルのすべての行の両方が含まれます。

C: フル/クロス(外側)結合:

完全外部結合: シンボリック接続テーブルの一致する行だけでなく、2 つの接続テーブル内のすべてのレコードも含まれます。

12. グループ化:

テーブル、グループ化が完了すると、クエリ後にグループ関連の情報しか取得できなくなります。

グループ関連情報:(統計情報)カウント、合計、最大、最小、平均のグループ化基準)

SQL Server でグループ化する場合: text、ntext、image タイプのフィールドはグループ化の基準として使用できません

selecte 統計関数のフィールドを通常のフィールドと一緒に配置することはできません。

13. データベースを操作します:

切り離されたデータベース: sp_detach_db; 接続されたデータベース: sp_attach_db 以下は、添付ファイルに完全なパス名が必要であることを示します

14. データベース名の変更方法:

sp_renamedb 'old_name', 'new_name'

2. 改善

1. 説明:テーブルをコピー(構造のみコピー、ソーステーブル名:a、新テーブル名:b)(アクセス可)

方法 1: select * into b from a where 1<>1 (SQlServer のみ)

方法 2: a から上位 0 * を b に選択します

2. 説明: テーブルのコピー (データのコピー、ソーステーブル名: a ターゲットテーブル名: b) (アクセス可能)

insert into b(a, b, c) select d,e,f from b;

3. 説明:データベース間でテーブルをコピー(特定のデータには絶対パスを使用)(アクセス可能)

insert into b(a, b, c) select d,e,f from b in ‘特定のデータベース’ where 条件

例: ..from b in '"&Server.MapPath(".")&"data.mdb" &"' where..

4. 説明:サブクエリ(テーブル名1:a テーブル名2:b)

select a,b,c from a where a IN (select d from b ) または: select a,b,c from a where a IN (1,2,3)

5. 説明: 記事、投稿者、最終返信時刻を表示します

select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6. 説明:外部結合クエリ(テーブル名1:a テーブル名2:b)

select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7. 説明: オンラインビュークエリ(テーブル名1:a)

select * from (SELECT a,b,c FROM a) T where t.a > 1;

8. 説明: between の使用法はクエリデータの範囲を制限し、境界値を含みますが、 between は含まれません

select * from table1 where time1 と time2 の間の時間

aが値1と値2の間にないa、b、cをtable1から選択します

9. 説明:

での使い方

select * from table1 where a [not] in ('value 1', 'value 2', 'value 4', 'value 6')

10. 説明: 2つの関連テーブル、セカンダリテーブルにないメインテーブルの情報を削除します

存在しないtable1から削除(select * from table2 where table1.field1=table2.field1)

11. 説明: 4 つのテーブルの結合クエリ質問:

select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

12. 説明: 5分前のスケジュールリマインダー

SQL: select * from schedule where datediff(' minutes',f start time,getdate())>5

13. 説明: データベースのページングを完了する 1 つの SQL ステートメント

上位 10 件 b.* から (上位 20 件の主キー フィールドを選択、フィールドの並べ替えによるテーブル名順) a、テーブル名 b ここで、主キー フィールド = a による並べ替え。フィールド

具体的な実装:

データベースページングについて:

@start int,@end intを宣言します

@sql nvarchar(600)

set @sql='select top'+str(@end-@start+1)+'+from T where Rid not in(select top'+str(@str-1)+'Rid from T where Rid> -1)'

exec sp_executesql @sql

注: top の後に直接変数を続けることはできないため、実際のアプリケーションではこれが特別な処理を実行する唯一の方法です。 Rid は識別列です。先頭の後に特定のフィールドがある場合、これは非常に有益です。これにより、最上位フィールドに論理インデックスが作成されている場合、クエリ結果後の実際のテーブルの不整合を回避できるため (論理インデックス内のデータはデータ テーブル内のデータと一致しない可能性があり、クエリ中にインデックス内にある場合は、インデックスが最初にクエリされます)

14. 説明: 最初の10レコード

上位 10 を選択 * form table1 where range

15. 説明: 同じ b 値を持つデータのグループごとに、a が最も大きいレコードの情報をすべて選択します (月次フォーラムランキング、月次売れ筋商品分析、科目スコアランキングなどにも同様の使い方が可能です、など)

select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16. 説明: TableA にはすべての行を含めますが、TableB と TableC には含めず、重複する行をすべて削除して結果テーブルを導出します

(テーブルAからaを選択)以外(テーブルBからaを選択)(テーブルCからaを選択)を除く

17. 説明: データをランダムに10個取り出します

newid()によるテーブル名の順序から*トップ10を選択

18. 説明: レコードをランダムに選択します

newid()を選択

19. 説明: 重複したレコードを削除します

1)、idが入っていないテーブル名から削除(テーブル名グループからcol1,col2,...でmax(id)を選択)

2)、select unique * into temp from tablename

テーブル名から削除

insert into tablename select * from temp

評価: この操作には大量のデータの移動が含まれます。このアプローチは大容量のデータ操作には適していません。

3)例えば、外部テーブルにデータをインポートする場合、初回は何らかの理由で一部のみがインポートされますが、特定の場所を特定するのが難しいため、このようにしてすべてのデータをインポートすることしかできません。次回インポートすると、重複フィールドが大量に生成されます

テーブルテーブル名を変更します

--自動インクリメント列を追加します

column_b intidentity(1,1)を追加します

column_b が含まれていないテーブル名から削除します (

)

select max(column_b) from tablename group by columns1,column2,...)

alter table tablenamedrop column column_b

20. 説明: データベース内のすべてのテーブル名をリストします

select name from sysobjects where type='U' // U はユーザーを表します

21. 説明: テーブル内のすべての列名をリストします

id=object_id('TableName') の syscolumns から名前を選択します

22. 説明: type、vendor、pcs フィールドを type フィールドごとにリストし、select の場合と同様に、複数の選択を簡単に実装できます。

select type,sum(case ベンダー when 'A' then pcs else 0 end),sum(case ベンダー when 'C' then pcs else 0 end),sum(case ベンダー when 'B' then pcs else 0 end) FROMテーブル名をタイプごとにグループ化

表示結果:

タイプベンダーPC

コンピュータA 1

コンピュータA 1

Disc B 2

Disc A 2

モバイルB3

モバイルC3

23. 説明:テーブルtable1を初期化します

TRUNCATE TABLE table1

24. 手順: 10から15までのレコードを選択してください

select top 5 * from (select top 15 * from table order by id asc) table_alias order by id desc

3. スキル

1. SQL文の組み合わせでは1=1、1=2がよく使われます

「where 1=1」はすべてを選択することを意味します。「where 1=2」はすべてを選択しないことを意味します、

例:

if @strWhere !=''

始まります

set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere

終わり

その他

始まります

set @strSQL = 'select count(*) as Total from [' + @tblName + ']'

終わり

のように直接書くことができます

エラー! ディレクトリ エントリが見つかりません。

set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1安定 '+ @strWhere 2. データベースを縮小します

--インデックスを再構築します

DBCC REINDEX

DBCC INDEXDEFRAG

--データとログを圧縮します

DBCC SHRINKDB

DBCC シュリンクファイル

3. データベースを圧縮します

dbcc シュリンクデータベース(dbname)

4. 既存のユーザー権限を持つ新しいユーザーにデータベースを転送します

exec sp_change_users_login 'update_one','newname','oldname'

ゴー

5.バックアップセットを確認します

disk='E:dvbbs.bak' から検証のみ復元します

6.データベースを修復する

ALTER DATABASE [dvbbs] SET SINGLE_USER

GO

DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK

GO

ALTER DATABASE [dvbbs] SET MULTI_USER

GO

7.ログのクリア

ノーカウントをオンに設定

@LogicalFileName sysname,

を宣言してください

@MaxMinutes INT、

@NewSize INT

USE tablename -- 操作するデータベースの名前

SELECT @LogicalFileName = 'tablename_log', -- ログファイル名

@MaxMinutes = 10, -- ログのラップに許可される時間の制限

@NewSize = 1 -- 設定したいログファイルのサイズ(M)

セットアップ/初期化

@OriginalSize int を宣言してください

@OriginalSize = サイズを選択してください

sysfilesから

WHERE name = @LogicalFileName

SELECT '元のサイズ ' + db_name() + ' LOG は ' +

CONVERT(VARCHAR(30),@OriginalSize) + ' 8K ページ または ' +

CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'

sysfilesから

WHERE name = @LogicalFileName

テーブル DummyTrans を作成します

(DummyColumn char (8000) not null)

@Counter INT を宣言してください、

@StartTime DATETIME,

@TruncLog VARCHAR(255)

SELECT @StartTime = GETDATE(),

@TruncLog = 'バックアップログ' + db_name() + ' WITH TRUNCATE_ONLY'

DBCC SHRINKFILE (@LogicalFileName, @NewSize)

EXEC (@TruncLog)

-- 必要に応じてログをラップします。

WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- 時間は切れていません

AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)

AND (@OriginalSize * 8 /1024) > @NewSize

BEGIN -- 外側のループ。

SELECT @Counter = 0

WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))

BEGIN -- 更新

INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans

SELECT @Counter = @Counter + 1

終了

EXEC (@TruncLog)

終了

SELECT '最終サイズ ' + db_name() + ' LOG は ' +

CONVERT(VARCHAR(30),size) + ' 8K ページ または ' +

CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'

sysfilesから

WHERE name = @LogicalFileName

DROP TABLE DummyTrans

カウントをオフに設定してください

8. 説明: テーブルを変更します

exec sp_changeobjectowner 'tablename','dbo'

9. 変更をすべてのテーブルに保存します

CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch

@OldOwner as NVARCHAR(128),

@NewOwner as NVARCHAR(128)

AS

@Name を NVARCHAR(128) として宣言します

@Owner を NVARCHAR(128) として宣言します

@OwnerName を NVARCHAR(128) として宣言します

curObject CURSOR FOR を宣言します

「名前」=名前を選択してください、

'所有者' = user_name(uid)

sysobjectsより

user_name(uid)=@OldOwner

名前で注文します

curObjectを開く

curObject INTO @Name, @Owner から次を取得します

WHILE(@@FETCH_STATUS=0)

始まります

if @Owner=@OldOwner

始まります

set @OwnerName = @OldOwner + '.' + rtrim(@Name)

exec sp_changeobjectowner @OwnerName, @NewOwner

終わり

-- @name、@NewOwner、@OldOwnerを選択してください

curObject INTO @Name, @Owner から次を取得します

終了

curObjectを閉じる

curObjectの割り当てを解除します

GO

10. SQL SERVERのループにデータを直接書き込む

@i intを宣言

@i=1を設定

ながら@i<30

始まります

テスト(ユーザーID)の値(@i)に挿入

@i=@i+1を設定

終わり

ケース:

以下の表では、不合格者全員が修正され、毎回 0.1 ずつ増加して合格することが求められています。

ネームスコア

張山80

リシ59

王武50

松泉69

while((select min(score) from tb_table)<60)

始まります

tb_table セットスコア =score*1.01 を更新します

スコア<60

if (select min(score) from tb_table)>60

休憩

その他

続ける

終わり

データ開発 - クラシック

1. 姓の画数順に並べ替えます:

Select * From TableName Order By CustomerName Collat​​e Chinese_PRC_Stroke_ci_as //少ないものから多いものへ

2. データベース暗号化:

暗号化('元のパスワード')を選択

pwdencrypt('元のパスワード')を選択

select pwdcompare('元のパスワード','暗号化されたパスワード') = 1 -- それ以外は同じではありません encrypt('元のパスワード')

pwdencrypt('元のパスワード')を選択

select pwdcompare('元のパスワード','暗号化されたパスワード') = 1 -- それ以外は同じです

3. テーブル内のフィールドを取得します:

@list varchar(1000),

を宣言します

@sql nvarchar(1000)

select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='Table A'

set @sql='select '+right(@list,len(@list)-1)+' from table A'

exec (@sql)

4. ハードディスクのパーティションを表示します:

EXECマスター..xp_fixeddrives

5. テーブル A と B を比較して、それらが等しいかどうかを確認します:

if (Aからchecksum_agg(binary_checksum(*))を選択)

=

(Bからchecksum_agg(binary_checksum(*))を選択)

「等しい」を印刷します

その他

「等しくない」と印刷します

6. すべてのプロファイラープロセスを強制終了します:

DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses

WHERE プログラム名 IN('SQL プロファイラー',N'SQL プロファイラー')

EXEC sp_msforeach_worker '?'

7.レコード検索:

最初からNレコードまで

トップ N を選択 * 表から

--------------------------------

N〜Mレコード(プライマリインデックスIDが必要)

Select Top M-N * From table Where ID in (Select Top M ID From table) Order by ID Desc

--------------------------------

エンドレコードまでN

上位 N を選択 * 表から ID 説明で注文

事件

例 1: テーブルに 10,000 件を超えるレコードがあります。テーブルの最初のフィールドである RecID は、テーブルの 31 番目から 40 番目のレコードを検索するための SQL ステートメントを記述します。

recid が入っていない A から上位 10 件の reid を選択(A から上位 30 件の reid を選択)

分析: このように書くと、テーブル内に recid の論理インデックスがある場合、いくつかの問題が発生します。

select top 10 recid from A where... はインデックスから検索されますが、後続の select top 30 recid from A はデータ テーブル内で検索されるため、インデックス内の順序はデータ テーブル内の順序と一致しない可能性があります。その結果、クエリされたデータは、元の目的のデータではなくなります。

解決策

1. A order by ricid から order by select top 30 recid を使用する フィールドが自動的に成長しない場合、問題が発生します

2. そのサブクエリに条件を追加します: A where recid>-1 から上位 30 件の recid を選択します

例 2: テーブル内の最後のレコードをクエリします。テーブル内にどれだけのデータがあるか、およびテーブル構造がわかりません。

set @s = 'select top 1 * from T where pid not in (select top ' + str(@count-1) + ' pid from T)'

print @s exec sp_executesql @s

9: 現在のデータベース内のすべてのユーザーテーブルを取得します

xtype='u' および status>=0 の sysobjects から名前を選択します

10: テーブルのすべてのフィールドを取得します

id=object_id('テーブル名')のsyscolumnsから名前を選択します

select name from syscolumns where id in (select id from sysobjects where type = 'u' and name = 'table name')

どちらの方法でも効果は同じです

11: テーブルに関連するビュー、ストアドプロシージャ、関数を表示する

select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%table name%'

12: 現在のデータベース内のすべてのストアド プロシージャを表示します

xtype='P' の sysobjects からストアド プロシージャ名として名前を選択します

13: ユーザーが作成したすべてのデータベースをクエリします

select * from master..sysdatabases D where sid not in (select sid from master..syslogins where name='sa')

または

dbid を選択し、master..sysdatabases から AS DB_NAME を選択します。ここで、sid <> は 0x01 です

14: 特定のテーブルのフィールドとデータ型をクエリします

information_schema.columnsからcolumn_name,data_typeを選択します

where table_name = 'テーブル名'

15: 異なるサーバーデータベース間のデータ操作

--リンクサーバーを作成します

Exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', 'リモートサーバー名またはIPアドレス'

exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, 'username ', 'password '

--クエリの例

ITSV.データベース名.dbo.テーブル名から*を選択

--インポート例

ITSV.データベース名.dbo.テーブル名からテーブルに * を選択

--リンクされたサーバーが使用されなくなったら削除します

exec sp_dropserver 'ITSV ', 'droplogins '

--リモート/LANデータを接続する(openrowset/openquery/opendatasource)

--1.openrowset

--クエリの例

select * from openrowset( 'SQLOLEDB ', 'SQLサーバー名 '; 'ユーザー名 '; 'パスワード ', データベース名.dbo.テーブル名)

--ローカルテーブルを生成します

select * into table from openrowset( 'SQLOLEDB ', 'SQLサーバー名 '; 'ユーザー名 '; 'パスワード ', データベース名.dbo.テーブル名)

--ローカルテーブルをリモートテーブルにインポートします

insert openrowset( 'SQLOLEDB ', 'SQLサーバー名 '; 'ユーザー名 '; 'パスワード ', データベース名.dbo.テーブル名)

*ローカルテーブルから選択

--ローカルテーブルを更新します

更新します

b.A列=a.A列を設定

openrowset( 'SQLOLEDB ', 'SQLサーバー名 '; 'ユーザー名 '; 'パスワード ', データベース名.dbo.テーブル名) を内部結合ローカルテーブルとして b

a.column1=b.column1 で

--Openquery を使用するには接続を作成する必要があります

--まずリンクサーバーを作成するための接続を作成します

Exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', 'リモートサーバー名またはIPアドレス'

--クエリ

*

を選択してください

FROM openquery(ITSV, 'SELECT * FROM データベース.dbo.テーブル名')

--ローカルテーブルをリモートテーブルにインポートします

insert openquery(ITSV, 'SELECT * FROM database.dbo.tablename')

ローカルテーブルから*を選択

--ローカルテーブルを更新します

更新します

b.B列=a.B列を設定します

FROM openquery(ITSV, 'SELECT * FROM database.dbo.tablename') as a

a列A=bのローカルテーブルbを内部結合します

--3.opendatasource/openrowset

選択 *

FROM opendatasource( 'SQLOLEDB ', 'データソース=ip/サーバー名;ユーザーID=ログイン名;パスワード=パスワード' ).test.dbo.roy_ta

--ローカルテーブルをリモートテーブルにインポートします

insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=login name;Password=password ').Database.dbo.Table name

ローカルテーブルから*を選択

SQL Serverの基本機能

SQL Serverの基本機能

1.長さと分析のための文字列関数

1,datalength(Char_expr)は文字数を含む文字列を返しますが、以下のスペースは含まれません

2. substring(expression,start,length) は部分文字列を受け取ります。文字列の添え字は「1」から、start は開始位置、length は文字列の長さです。長さを取得するために使用されます。

3,right(char_expr,int_expr) は文字列の右側の int_expr 文字を返し、left を使用してその逆を行います

4.isnull( check_expression , replace_value ) check_expressionが空の場合はreplacement_valueの値を返し、空でない場合はcheck_expressionの文字操作クラスを返します

5,Sp_addtypeカスタムデータ型

例: EXEC sp_addtype Birthday, datetime, 'NULL'

6,nocount {on|off}を設定します

返される結果に、Transact-SQL ステートメントの影響を受ける行数に関する情報が含まれなくなります。ストアド プロシージャに実際のデータをあまり返さないステートメントが含まれている場合、この設定によりネットワーク トラフィックが大幅に削減され、パフォーマンスが大幅に向上します。 SET NOCOUNT 設定は、解析時ではなく、実行時または実行時に設定されます。

SET NOCOUNT が ON の場合、カウント (Transact-SQL ステートメントの影響を受ける行数を示す) は返されません。

SET NOCOUNTがOFFの場合、カウントを返します

常識

SQLクエリの場合: fromが後に続くテーブルまたはビューの最大数: 256

SQL ステートメントに Order by が含まれている場合、クエリを実行するときに、まずソートしてからフェッチします

nvarchar は Unicode コードであるため、SQL ではフィールドの最大容量は 8000、nvarchar の場合は (4000) です。

SQLServer2000同期レプリケーションテクノロジ実装手順

1. 準備作業

1. パブリッシャーとサブスクライバーの両方が同じ名前の Windows ユーザーを作成し、公開されたスナップショット フォルダーへの有効なアクセス ユーザーとして同じパスワードを設定します

--管理ツール

--コンピュータ管理

--ユーザーとグループ

--ユーザーを右クリックします

--新規ユーザー

--Windowsにログインするための管理者グループに属するユーザー(SynUser)を作成します

2. 公開サーバー上で、公開されたスナップショット ファイルの保存ディレクトリとして新しい共有ディレクトリを作成します。 操作:

私のコンピュータ--D: PUB

という名前の新しいディレクトリを作成します

--新しく作成したディレクトリを右クリックします

--プロパティ--共有

--「このフォルダーを共有」を選択します

--「権限」ボタンを使用して特定のユーザー権限を設定し、最初のステップで作成したユーザー(SynUser)がフォルダーに対するすべての権限を持っていることを確認します

--わかりました

3. SQL Agent (SQLSERVERAGENT) サービスの起動ユーザーを設定します (この設定はパブリッシュ/サブスクライブ サーバーの両方に対して行われます)

スタート--プログラム--管理ツール--サービス

--SQLSERVERAGENT を右クリックします

--プロパティ--ログイン--「このアカウント」を選択します

-- 最初のステップで作成した Windows ログイン ユーザー名 (SynUser) を入力または選択します

--「パスワード」にユーザーのパスワードを入力します

4. 接続時の権限の問題を解決するために SQL Server 認証モードを設定します (この設定はパブリッシュ/サブスクライブ サーバーの両方に必要です)

エンタープライズマネージャー

-- SQL インスタンスを右クリック -- プロパティ

--セキュリティ--認証

--「SQL Server と Windows」を選択します

--わかりました

5. パブリッシャーとサブスクライバーで相互に登録します

エンタープライズマネージャー

--SQL Server グループを右クリックします

--新しい SQL Server の登録...

-次のステップ--利用可能なサーバーに、登録したいリモートサーバーの名前を入力します--追加

-次のステップ--接続して使用し、2番目の「SQL Server認証」を選択します

-次のステップ--ユーザー名とパスワード(SynUser)を入力してください

-次のステップ--SQL Server グループを選択するか、新しいグループを作成できます

--次のステップ--完了

6. IPのみ使用可能でコンピューター名は使用できない方は、サーバーエイリアスを登録します(この手順は実装では使用しません)

(接続側で設定します。たとえば、サブスクライバサーバーで設定する場合は、サーバー名に公開サーバーのIPを入力します)

スタート--プログラム--Microsoft SQL Server--クライアントネットワークユーティリティ

--エイリアス--追加

--ネットワークライブラリとして「tcp/ip」を選択します--サーバーエイリアスとしてSQLサーバー名を入力します

--接続パラメータ--サーバー名にSQLサーバーのIPアドレスを入力します

--SQL ポートを変更する場合は、「ポートを動的に決定する」の選択を解除し、対応するポート番号を入力します

2.正式な構成

1.公開サーバーを設定します

Enterprise Manager を開き、公開サーバー (B、C、D) で次の手順を実行します。

(1) [ツール]ドロップダウンメニューの[コピー]サブメニューから[発行、サブスクライバ、および配布の構成]を選択し、発行および配布構成ウィザードを表示します

(2) [次のステップ] 配信サーバーを選択します 公開サーバー自体を配信サーバーとして使用するか、他の SQL サーバーを使用するかを選択できます (自分で選択します)。

(3) 【次のステップ】スナップショットフォルダーを設定します

デフォルトの \servernamePub を使用します

(4) [次のステップ] カスタム構成

次のいずれかを選択できます: はい、ディストリビューション データベースのプロパティを設定して公開サーバーを有効にするか、公開設定を設定します

いいえ、次のデフォルト設定を使用します(推奨)

(5) 【次のステップ】ディストリビューションデータベースの名前と場所を設定し、デフォルト値を使用します

(6) [次のステップ] 公開サーバーを有効にし、公開サーバーとして選択します

(7) 【次のステップ】公開するデータベースと公開タイプを選択します

(8) [次のステップ] 購読者登録を選択します

(9) [次のステップ] 設定を完了します

2.出版物を作成する

サーバーB、C、Dで公開

(1)[ツール]メニューの[コピー]サブメニューから[公開の作成と管理]コマンドを選択します

(2) パブリケーションを作成したいデータベースを選択し、[パブリケーションの作成]をクリックします

(3) [発行ウィザードの作成] のプロンプトダイアログボックスで [次へ] をクリックすると、ダイアログボックスが表示されます。ダイアログボックスの内容は 3 つのタイプからコピーされます。ここで、デフォルトのスナップショット リリースである最初の 1 つを選択します (他の 2 つについてはヘルプを確認できます)

(4) [次へ] をクリックすると、パブリケーションを購読できるデータベース サーバーの種類を指定する必要があります。

SQLSERVERでは、orACLEやACCESSなどの異なるデータベース間でのデータレプリケーションが可能です。

ただし、ここでは「SQL SERVER 2000」を実行しているデータベースサーバーを選択します

(5) [次へ]をクリックすると、記事を定義するためのダイアログボックスが表示されます。つまり、公開するテーブルを選択します

注: 先にトランザクションのパブリッシングを選択した場合、このステップでは主キーを持つテーブルのみを選択できます

(6) 出版物名と説明を選択します

(7)ウィザードが提供する公開属性をカスタマイズします:

はい、データフィルタリングをカスタマイズし、匿名サブスクリプションやその他のカスタム属性を有効にします

いいえ、指定された方法に従ってリリースを作成します(カスタマイズされた方法を推奨します)

(8)[次のステップ] フィルタリングと公開の方法を選択します

(9)【次のステップ】匿名購読を許可するかどうかを選択できます

1) 署名購読を選択した場合は、パブリッシャーに購読者を追加する必要があります

方法:[ツール]->[コピー]->[公開、購読者、配布プロパティの設定]->[購読者]に

を追加

それ以外の場合は、サブスクライバー サーバーでサブスクリプションをリクエストするときにプロンプ​​トが表示されます: パブリケーションが変更された場合、匿名サブスクリプションは許可されません

それでも匿名で購読する必要がある場合は、次の解決策を使用してください

[Enterprise Manager]->[コピー]->[公開コンテンツ]->[プロパティ]->[サブスクリプション オプション] 匿名のサブスクリプション リクエストを許可する場合に選択します

2) 匿名サブスクリプションを選択した場合、サブスクライバーを設定するときに上記のプロンプトは表示されません

(10)[次のステップ] スナップショットエージェントのスケジュールを設定します

(11)[次のステップ] 設定を完了します

パブリケーションの作成が完了すると、パブリケーションが作成されたデータベースは共有データベースになります

データがあります

srv1. ライブラリ名..著者のフィールド: id、name、phone、

srv2. ライブラリ名..著者にはフィールドがあります: id、名前、電話番号、住所

要件:

srv1.ライブラリ名..著者がレコードを追加、srv1.ライブラリ名..著者のレコードが増加

srv1.Library name..authorのphoneフィールドが更新されると、srv1.Library name..authorの対応するフィールドphoneが更新されます

--*/

--広範な処理ステップ

--1. srv1でsrv2を操作して同期を実現するための接続サーバーをsrv1に作成します

Exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2 の SQL インスタンス名または IP'

exec sp_addlinkedsrvlogin 'srv2','false',null,'username','password'

ゴー

-2. 2台のコンピューターsrv1とsrv2で、msdtc(分散トランザクション処理サービス)を起動し、自動的に起動するように設定します

。私のコンピュータ -- コントロール パネル -- 管理ツール -- サービス -- 分散トランザクション コーディネーターを右クリック -- プロパティ -- スタートアップ -- スタートアップの種類を自動スタートアップに設定します

ゴー

--次にジョブを作成し、上記の同期ストアド プロシージャを定期的に呼び出します

エンタープライズマネージャー

--経営陣

--SQL Server エージェント

--右クリック割り当て

--新しい仕事

--「全般」項目にジョブ名を入力します

--「ステップ」アイテム

--新しい

--「ステップ名」にステップ名を入力します

--「種類」で「Transact-SQL Script (TSQL)」を選択します

--「データベース」はコマンドを実行するデータベースを選択します

--「コマンド」に実行する文を入力:exec p_process

--わかりました

--「スケジュール」項目

--新しいスケジュール

--「名前」にスケジュール名を入力します

--「スケジュールタイプ」でジョブの実行スケジュールを選択します

--「定期的」を選択した場合

--「変更」をクリックしてスケジュールを設定してください

次に、SQL Agent サービスを開始し、自動的に開始するように設定します。そうしないと、ジョブは実行されません

設定方法:

マイコンピュータ--コントロールパネル--管理ツール--サービス--SQLSERVERAGENTを右クリック--プロパティ--スタートアップの種類--「自動起動」を選択--OK。

-3. 同期を実現する方法2、定期的な同期

--srv1に次の同期ストアドプロシージャを作成します

proc p_processを作成します

として

--修正データを更新します

update b set name=i.name,telphone=i.telphone

srv2.ライブラリ名.dbo.author b,author iから

ここで、b.id=i.id と

(b.name <> i.name または b.telphone <> i.telphone)

--新しいデータを挿入します

srv2.ライブラリ名.dbo.author(id,name,telphone)を挿入

著者 i から ID、名前、電話番号を選択してください

存在しないところ(

srv2.ライブラリ名.dbo.author where id=i.id)から*を選択してください

--削除されたデータを削除します(必要な場合)

b

を削除

srv2.ライブラリ名.dbo.author b

より

存在しないところ(

select * from author where id=b.id)

ゴー

MySQL インデックス タイプには次のものが含まれます:

(1) 通常のインデックス

これは最も基本的なインデックスであり、制限はありません。次の方法で作成できます:

◆インデックスの作成

CREATE INDEX IndexName ON mytable(username(length)); CHAR、VARCHAR 型の場合、長さはフィールドの実際の長さより小さくてもかまいません。BLOB 型および TEXT 型の場合、長さを指定する必要があります。以下同様です。 。

◆テーブル構造を変更する

ALTER mytable ADD INDEX [indexName] ON (username(length)) ◆テーブル作成時に直接指定

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );

DROP INDEX [indexName] ON mytable;

(2) 固有のインデックス

前の通常のインデックスと似ていますが、インデックス列の値は一意である必要がありますが、null 値も許可される点が異なります。複合インデックスの場合、列値の組み合わせは一意である必要があります。次の方法で作成できます:

◆インデックスの作成

CREATE UNIQUE INDEXindexName ON mytable(username(length)) ◆テーブル構造の変更

ALTER mytable ADD UNIQUE [indexName] ON (username(length)) ◆テーブル作成時に直接指定

CREATE TABLE mytable( ID INT NOT NULL、ユーザー名 VARCHAR(16) NOT NULL、UNIQUE [indexName] (ユーザー名(長さ)) );

(3) 主キーインデックス

これは、Null 値を許可しない特別な一意のインデックスです。通常、主キーインデックスはテーブルの作成時に同時に作成されます:

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) ); もちろん、ALTER コマンドを使用することもできます。テーブルには主キーを 1 つだけ持つことができることに注意してください。

(4) 組み合わせインデックス

単一列インデックスと結合インデックスを視覚的に比較するには、テーブルに複数のフィールドを追加します:

CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL ); MySQL の効率をさらに引き出すには、複合インデックス。名前、都市、年齢をインデックスに構築するだけです:

ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age); テーブルを作成するとき、ユーザー名の長さは 16 で、ここでは 10 が使用されます。これは、通常、名前の長さが 10 を超えないため、インデックス クエリが高速化され、インデックス ファイルのサイズが削減され、INSERT の更新速度が向上します。

ユーザー名、都市、年齢にそれぞれ単一列インデックスを作成し、テーブルに 3 つの単一列インデックスがある場合、クエリ効率は前述の結合インデックスとは大きく異なり、クエリ効率ははるかに低くなります。複合インデックス。現時点では 3 つのインデックスがありますが、MySQL は最も効率的であると思われる単一列インデックスのみを使用できます。

このような結合インデックスを確立することは、実際には、次の 3 セットの結合インデックスを確立することと同じです:

usernname,city,age usernname,city usernname 都市と年齢のような組み合わせインデックスがないのはなぜですか?これは、MySQL 複合インデックスの「左端のプレフィックス」の結果です。簡単に理解すると、組み合わせは一番左のものから開始するだけです。これら 3 つの列を含むクエリがこの結合インデックスを使用するだけでなく、次の SQL もこの結合インデックスを使用します:

SELECT * FROM mytable WHREE username="admin" AND city="鄭州" SELECT * FROM mytable WHREE username="admin" 次のものは使用されません:

SELECT * FROM mytable WHREE age=20 AND city="鄭州" SELECT * FROM mytable WHREE city="鄭州"

(5)インデックス作成のタイミング

インデックスの作成方法を学習しましたが、どのような状況でインデックスを作成する必要があるでしょうか?一般に、WHERE および JOIN に出現するカラムにはインデックスを付ける必要がありますが、MySQL では <、<=、=、>、>=、BETWEEN、IN のインデックスのみが使用され、場合によっては LIKE でインデックスが使用されるため、これが完全に当てはまるわけではありません。索引。例:

SELECT t.Name FROM mytable t LEFT JOIN mytable m ON t.Name=m.username WHERE m.age=20 AND m.city='鄭州' このとき、都市と年齢をインデックスする必要があります。 mytable table userame も JOIN 句に出現し、インデックスを作成する必要があります。

インデックスを作成する必要があるのは特定の LIKE のみであると先ほど述べました。 MySQL はワイルドカード文字 % と _ で始まるクエリを作成するときにインデックスを使用しないためです。たとえば、次の文ではインデックスが使用されます:

SELECT * FROM mytable WHERE username like'admin%' と次の文は使用されません:

SELECT * FROM mytable WHEREt Name like'%admin' したがって、LIKE を使用する場合は、上記の違いに注意する必要があります。

(6) インデックスの欠点

インデックスを使用する利点は上で説明しましたが、インデックスを過度に使用すると乱用が発生します。したがって、インデックス作成には欠点もあります:

◆インデックスによりクエリ速度は大幅に向上しますが、テーブルに対するINSERT、UPDATE、DELETEなどのテーブル更新速度も低下します。テーブルを更新するとき、MySQL はデータを保存するだけでなく、インデックス ファイルも保存する必要があるためです。

◆インデックスファイルを作成するとディスク容量が占有されます。通常、この問題は深刻ではありませんが、大きなテーブルに複数の結合インデックスを作成すると、インデックス ファイルが急速に拡張します。

MySQL に大規模なデータ テーブルがある場合、インデックスは効率を向上させるための 1 つの要素にすぎません。最適なインデックスを構築したりクエリ ステートメントを最適化するために時間を費やす必要があります。

(7) インデックスを使用する際の注意点

インデックスを使用する場合、次のようなヒントと注意事項があります:

◆インデックスにはNULL値の列は含まれません

列に NULL 値が含まれている限り、その列はインデックスに含まれません。複合インデックス内の 1 つの列に NULL 値が含まれている限り、この列は複合インデックスに対して無効になります。したがって、データベースを設計するときは、フィールドのデフォルト値を NULL にしないでください。

◆短いインデックスを使用します

可能であればプレフィックスの長さを指定して、文字列にインデックスを付けます。たとえば、CHAR(255) 列がある場合、ほとんどの値が最初の 10 文字または 20 文字内で一意である場合は、列全体にインデックスを付けないでください。短いインデックスはクエリ速度を向上させるだけでなく、ディスク領域と I/O 操作を節約します。

◆インデックス列ソート

MySQL クエリはインデックスを 1 つだけ使用するため、インデックスが where 句で使用されている場合、order by の列はインデックスを使用しません。したがって、データベースのデフォルトの並べ替えで要件を満たすことができる場合は、並べ替え操作を使用しないでください。必要に応じて、これらの列に対して複合インデックスを作成することをお勧めします。

◆いいねステートメント操作

一般に、同様の操作の使用は推奨されません。使用する必要がある場合は、その使用方法も問題になります。 「%aaa%」のようにインデックスは使用されませんが、「aaa%」のようにインデックスが使用されます。

◆列を操作しないでください

select * from users where YEAR(adddate)<2007; は各行で動作します。これによりインデックスが失敗し、テーブル全体のスキャンが実行されます。そのため、これを

に変更できます。

select * from users where adddate<'2007-01-01'

◆NOT IN および <> 操作は使用しないでください

上記では、MySQL インデックス タイプを紹介しました。

この記事はインターネットから集めたもので、具体的なソースが不明瞭なので、ここでの知識をプロジェクト開発にある程度使用したので、それを要約して一か所に整理します。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/986428.html技術記事 mysql の高度な使用法、mysql の高度な使用法 1. 手順: データベースの作成 CREATE DATABASE データベース名 2. 手順: データベースの削除 Drop データベース dbname 3. 手順: SQL サーバーのバックアップ...

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート