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 評価: この操作には大量のデータの移動が含まれます。このアプローチは大容量のデータ操作には適していません。
。
)
のように直接書くことができます
@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 Collate 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 は文字列の長さです。長さを取得するために使用されます。
。
返される結果に、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) で次の手順を実行します。
(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。
を削除
より
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 セットの結合インデックスを確立することと同じです: 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 インデックス タイプを紹介しました。
この記事はインターネットから集めたもので、具体的なソースが不明瞭なので、ここでの知識をプロジェクト開発にある程度使用したので、それを要約して一か所に整理します。