错误 21002: [SQL-DMO]用户“XXX”已经存在

SQL用户“xxx”已经存在的解决方法

MSSQL2000迁移数据库或者还原数据库后,新建相同用户名的时候或者指定数据库登录用户时出现错误提示“错误21002:[SQL-DMO]用户“XXX”已经存在

产生原因:
这就是我们通常所说的“孤立用户”,所谓孤立用户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录。

我们建立了同样名称的数据库登录用户后,数据库中的表我们照样不能使用时因为sid的不同,就是系统登录表和数据库用户表中的用户名相同,但是sid字段不同,数据库中的还是以前旧系统的sid值,所以我们就要把它对应成我们新建的,数据库靠sid来识别用户。

[1g1g]滴答滴-侃侃#playID:-21707[/]

查看更多内容...

Posted in 数据库 at March 28, 2012. by 傻猫 .    Views: 7438    No Comments

Google nexus i9020/23 新手入门

Q0-0 : 如何查看手机生产日期? 查看手机生产地?

A :手机背面 电池仓 标签,串号下面的s/n。 第4、5位为年、月。
                 第4位:Z为2010年 B为2011年
                 第5位:123456789abc代表1-12月    查看生产地:手机关机按住(音量上键+电源键)进入Bootlodader   然后看第6行的 CARRIER INFO:xxx,这里的XXX就是销往地货制造定制  方的简称,如:VDF(沃达丰定制机)EUR(欧洲)HKT(香港HKT集团控股公司) TMB(T-Mobile定制机) SAR(沙特) AXI(印尼GSM/3G运营商AXIS) XSE(印度尼西亚)    SKT (韩国运营商SKT电信公司)

 Q0-1 : Nexus s 几个虚拟 按键的名称介绍:A :  从左到右依次为:返回键—— 菜单键 (四道杠)—— 搜索键 —— 主页键 (小房子)

 Q1 : 如何个性化铃声?
A :在SD卡目录里建立 ringtones(来电铃声文件夹);    alarms  (闹钟铃声文件夹)      notifications( 短信 通知铃声文件夹)

       然后 把你不同用途的铃声放到不同的文件夹下手机就可以了。 再进行如下设置 :
  1 来电铃声:设置/声音与显示/手机铃声   2短信铃声:短信/菜单/设置/选择铃声     3闹钟铃声:时钟/闹钟/添加闹钟/铃声

Posted in 手机相关 at March 19, 2012. by 傻猫 .    Views: 4941    1 Comment

mysql笔记(11)--子查询

CREATE TABLE clients (

  clno INT,

  fname VARCHAR(15),

  lname VARCHAR(15),

  job VARCHAR(15),

  account_balance DECIMAL(7,2));

 

INSERT INTO clients VALUES

  (10, 'sam','smith','auditor',5525.75),

  (20,'james','jones','manager',8960.25);

 

CREATE TABLE firms (

  clno INT,

  company VARCHAR(15),

  city VARCHAR(15));

 

INSERT INTO firms VALUES

  (10,'abc co','leduc'),

  (20,'def ltd','nisku'),

  (30,'ghi inc','nisku');

select * from firms where clno in(select clno from clients );

select * from firms where clno =(select clno from clients  where job=’manager’);

select fname,lname from clients where clno=(select max(clno) from firms);

select fname,lname from clients where clno=(select avg(clno) from firms);

如果内部查询返回空结果集,子查询会返回错误

子查询共有三种类型,区分它们的方法是根据返回结果的列数和行数。

如果一个子查询返回仅仅一列一行数据,被成为数量级子查询。一个数量级子查询可以用在任何适合数据值比较的地方(一个列值或者文本)。它常常被使用在where子句当中,跟随在比较操作符号后面。
如果子查询返回多个列,并且是一行记录的话,它被称为行级子查询。行级子查询是数量级子查询的发展,可以用在任何适合数量级子查询的地方。
最后,如果一个子查询返回多个列和多行的话,它被称为表级子查询。表级子查询可以用作涉及到表的查询操作,包含在from子句当中。它也常常被用在where子句当中,后面使用in或者exist或者一个确定的比较操作(确定的比较操作是一个比较操作通过使用some,all,或者any限定)

SELECT * FROM clients WHERE clno < ANY (SELECT clno FROM firms);

使用any的规则如下:

ANY返回true,如果子查询的比较操作至少有一个是是true
ANY
返回false,如果子查询返回为空行,或者比较任意一行都是false
ANY
的同义词是SOME,使用in等同于使用= ANY

在这里,第一次的比较还是返回false,而第二此返回true,最后,子查询的结果是false,所以查询返回空行。使用all的规则是:

返回true,如果子查询返回空行记录,或者子查询的每一个结果比较都为true的话。
返回false,如果子查询至少有一个比较结果返回false

在有些时候,查询的结果是子查询是否有一个结果返回。使用[NOT] EXISTS来判断结果集是否为空。如果你的子查询至少有一行返回,使用EXISTS返回true;否则,返回为false。还有一种用法,NOT EXISTS,如果子查询结果集为空,它返回为true,否则的话,返回为true。一般情况下,子查询跟随在[NOT] EXISTS后面,以select *开头。在这里,星号(*)不是表示列出所有的列,而是表示为列出一些列。

SELECT * FROM clients WHERE EXISTS  (SELECT * FROM firms);

也可以把一个子查询,作为一个表名,放在from子句后面(就像oracle里面的用法一样,作为内部视图):

select * from(select * from clients where job like'a%')as cl;//cl作为一个子查询的临时结果集:

当子查询被使用在from子句当中,关键字as是强制使用的;中间的临时结果必须被命名,作为外部的查询被引用。

mysql> update clients set account_balance=(select sum(clno)*2 from firms) where

fname='sam';

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 3296    No Comments

mysql笔记(12)--外键约束

如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张 表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式的区别和联系。


这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。
首先创建用户组表:
创建用户组表
create table t_group (
id int not null,
name varchar(30),
primary key (id)
);
并插入两条记录:
插入记录
insert into t_group values (1, 'Group1');
insert into t_group values (2, 'Group2');


下面创建用户表,分别以不同的约束方式创建外键引用关系:
1、级联(cascade)方式
级联方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete cascade on update cascade
);


参照完整性测试
insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符


约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #导致t_user中的2、3记录级联删除
update t_group set id=2 where id=1; #导致t_user中的1记录的groupid级联修改为2


2、置空(set null)方式
置空方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete set null on update set null
);


参照完整性测试insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符


约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #导致t_user中的2、3记录的groupid被设置为NULL
update t_group set id=2 where id=1; #导致t_user中的1记录的groupid被设置为NULL


3、禁止(no action / restrict)方式
禁止方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete no action on update no action
);


参照完整性测试
insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符


约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #错误,从表中有相关引用,因此主表中无法删除
update t_group set id=2 where id=1; #错误,从表中有相关引用,因此主表中无法修改


注:在MySQL中,restrict方式与no action方式作用相同。

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 3773    No Comments

mysql笔记(9)--变更数据表结构

1,重新命名数据表
alter table A rename to B  //
数据表A改名为B
rename table A to B                //
数据表A改名为B
rename A toC,B to A,C to A    //
数据表A和数据表B互换名字
alter table S.A rename to T.A                //
数据库S里面的表A移动到数据库B里面
rename table S.A to T.A   //
数据库S里面的表A移动到数据库B里面
2,
改变数据列的类型
我们现在要把数据表A里面的一个smallint unsigned类型的数据列I再次改动为mediumint unsigned类型
alter table A motify I mediumint unsigned
alter table A change I I mediumint unsigned
注意change子句的特点:不仅能够改变数据列的类型,还能改变数据列的名字。这是modify子句所不能完成的。下面就把这个数据列改名了。
alter table A change I J mediumint unsigned
3,
将数据表由可变长度数据行转变成固定长度数据行
有的时候为了提高性能,需要做这样的转变,但有一点需要注意:必须用同一条alter命令来一次改变所有的数据列,不能仅仅改变一个数据列!举例如下:
create table A(name varchar(40),address varchar(80))
我们开始修改命令就应该是:
alter table A modify name char(40),modify address char(80);
4,
将数据表由固定长度数据行转变成可变长度数据行
如果觉得空间利用率不高,那就需要再转变回来,这个就很简单了,没有特别要求
alter table A modify name varchar(40)
5,
转换数据表类型
我们知道,MySQL数据库存在多种数据表类型,但每一种类型的特性并不相同。
如果你想让你的数据表支持事务处理机制。那就必须把它搞成BDBinnoBDB格式
alter table A type= BDB
alter table A type= InnoBD

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 3951    No Comments

mysql笔记(6)--select高级查询(四)连接

1.交叉连接CROSS JOIN
如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积;

举例,下列A、B、C 执行结果相同,但是效率不一样:
A:SELECT * FROM table1 CROSS JOIN table2
B:SELECT * FROM table1,table2

C:select * from table1 a inner join table2 b


A:select a.*,b.* from table1 a,table2 b where a.id=b.id
B:select * from table1 a cross join table2 b where a.id=b.id (注:cross join后加条件只能用where,不能用on)
C:select * from table1 a inner join table2 b on a.id=b.id


一般不建议使用方法A和B,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据WHERE条件从中选择。
因此,如果两个需要求交际的表太大,将会非常非常慢,不建议使用。

2.. 内连接INNER JOIN
两边表同时符合条件的组合

如果仅仅使用
SELECT * FROM table1 INNER JOIN table2

内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂要先生成行数乘积的数据表,内连接的效率要高于笛卡尔积的交叉连接。

但是通常情况下,使用INNER JOIN需要指定连接条件。

3.关于等值连接和自然连接

等值连接(=号应用于连接条件, 不会去除重复的列)

自然连接(会去除重复的列)

数据库的连接运算都是自然连接,因为不允许有重复的行(元组)存在。
例如:

SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column

4. 外连接OUTER JOIN
指定条件的内连接,仅仅返回符合连接条件的条目。
外连接则不同,返回的结果不仅包含符合连接条件的行,而且包括左表(左外连接时), 右表(右连接时)或者 两边连接(全外连接时)的所有数据行。

1)左外连接LEFT [OUTER] JOIN
显示符合条件的数据行,同时显示左边数据表不符合条件的数据行,右边没有对应的条目显示NULL
例如
SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column
2)右外连接RIGHT [OUTER] JOIN
显示符合条件的数据行,同时显示右边数据表不符合条件的数据行,左边没有对应的条目显示NULL
例如
SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column
3)全外连接full [outer] join
显示符合条件的数据行,同时显示左右不符合条件的数据行,相应的左右两边显示NULL,即显示左连接、右连接和内连接的并集

在检索时指定多个表,将每个表用都好分隔,这样每个表的数据行都和其他表的每行交叉产生所有可能的组合,这样就是一个全连接。

select * from xindi,student;

select xindi.*,student.* from xindi,student where xindi.id=student.id;

左连接:左边的表一定有,若右边的表有匹配的项,则写出,若没有则用null

select *from xindi left join student on xindi.id=student.id; //on 类似于where

如果只有ON子句的条件,那么左边表的每一行都会返回。

如:select *from xindi left join student on xindi.id=1; //返回的是与上面一行相同的结果

Left join 常与where结合:

mysql> select *from xindi left join student on xindi.id=student.id where student.id is not null ; //on xindi.id=student.id是连接的条件

等价于mysql> select *from xindi left join student where xindi.id=student.id ; 内连接

如:create table stu(stu_id int primary key,stu_name char(10),class_id int);

    create table class(class_id int,class_name char(10));

insert into stu values(1,‘lili’,11),(2,'lucy',12),(3,'jim',13);

   insert class values(11,'gradeone'),(12,'gradetwo'),(14,'gradetwo');

mysql> select stu.stu_id,class.class_id from stu join class on(stu.class_id=class.class_id);

mysql> select stu.stu_name, class.class_name from stu left join class on(stu.class_id=class.class_id); //左连接

mysql> select stu.stu_name, class.class_name from stu right join class on(stu.class_id=class.class_id); //右连接

mysql> select stu.stu_name, class.class_name from stu join class on(stu.class_id=class.class_id); //全连接

注:全连接和左连接的结果集排列顺序是不同的

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 5114    No Comments

mysql笔记(6)--select高级查询(二)sql变量,对字符串的处理,null值

1.设置sql变量

可以使用查询结果来设置变量,我们能够方便的把一些结果保存起来以供他用。变量命名规则是:@name,赋值语法是 @name:=value,

如:select @bir:=birth from stu where name=‘lili’;

select * from stu where birth>=@bir;

也可以用子查询得到上述结果:select * from stu where birth>(select birth from stu where name='lili');

2. mysql对字符串的处理

mysql能够支持的数据类型,和其它的数据库一样,我们可以处理各种数值(整型,浮点),字符串型,日期/时间型,NULL值等等。大家在使用的需要注 意不同类型的数值的格式是不一样的。在这里,对字符串的处理有一个比较特殊的地方大家需要理解。因为字符串两端是需要用引号(单引号,双引号)括起来的, 但是如果字符串本身里面也包括了引号(单引号,双引号),我们应该怎么办呢。这时就必须用以下三种方法之一来标识这个特殊的字符串。
   (1)如果字符串内部的引号字符与字符串两端的引号字符相同,则双写该引号
‘I can’’t’
“He said,””I told you so, “”’
   (2). 用与字符串内部的引号字符不同的引号把该字符串引起来,此时,就不用双写字符串内部的引号了
“I can’t”
‘He said,”I told you so,”’
   (3)用反斜杠对字符串内部的引号字符进行转义,此时与字符串两端的引号无关
     ‘I can\’t’
      “He said,\”I told you so,\””

2. null 值的问题

mysql> INSERT INTO my_table (phone) VALUES (NULL);

mysql> INSERT INTO my_table (phone) VALUES ("");

两个语句把值插入到phone列,但是第一个插入一个NULL值而第二个插入一个空字符串。第一个的含义可以认为是“电话号码不知道”,而第二个则可意味着“她没有电话”。

在SQL中,NULL值在于任何其他值甚至NULL值比较时总是假的(FALSE)。包含NULL的一个表达式总是产生一个NULL值,如:select null+2;返回null

当使用ORDER BY时,首先呈现NULL值。如果你用DESC以降序排序,NULL值最后显示。当使用GROUP BY时,所有的NULL值被认为是相等的。

为了有助于NULL的处理,你能使用IS NULL和IS NOT NULL运算符和IFNULL()函数。

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 4862    No Comments

mysql笔记(6)--select高级查询(一)

1.表和列的别名:

(1) mysql> SELECT name,species FROM pet ORDER BY name, species;

mysql> SELECT name,species FROM pet ORDER BY 1,2;

mysql> SELECT name AS n,species AS s FROM pet ORDER BY n,s;

   mysql> SELECT name n,species s FROM pet ORDER BY n,s;

用列的别名构造新表: mysql> CREATE TABLE pet1

                           -> SELECT name (AS) animal,owner (AS) child

                            -> FROM pet;

你可以在GROUP BY、ORDER BY或在HAVING部分中使用别名引用列。注意,你的ANSI SQL 不允许你在一个WHERE子句中引用一个别名。

select name n, count(*)as total from xindi group by n;//正确

select phone p from xindi where p>123;//错误

 

(2)表的别名具体方法类似于列。

列的别名经常用于表自身的连接中。你不必有2个不同的表来执行一个联结。如果你想要将一个表的记录与同一个表的其他记录进行比较,联结一个表到自身有时是有用的。

   pet联结自身来进行相似种类的雄雌配对:

   mysql> SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species

       -> FROM pet AS p1, pet AS p2

       -> WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m";


2.where ,group by,having 用法小注:select name,sum(phone) from xindi group by phone having sum(phone)>1233;

执行where子句查找符合条件的数据;

使用group by 子句对数据进行分组;

对group by 子句形成的组运行聚集函数计算每一组的值;

最后用having 子句去掉不符合条件的组。

需要注意:having 子句中的每一个元素也必须出现在select列表中。有些数据库例外,如oracle.

having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。

having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。

select dno,sum(salary)from employe group by dno having sum(salary)>10000


3.limit,concat的用法,分离year,month,day

(1)limit的用法

mysql> select * from xindi order by phone limit 2; //只取前两个值

+-------+-------+-------+----+

| name | phone | email | id |

+-------+-------+-------+----+

| brown | NULL | NULL | 5 |

| lili |   123 | NULL | 6 |

+-------+-------+-------+----+

2 rows in set (0.01 sec)


mysql> select * from xindi order by phone limit 2,2; //只取第三和第四个值

+------+-------+-------+----+

| name | phone | email | id |

+------+-------+-------+----+

| lili |   123 | NULL | 7 |

| Lucy | 13456 | NULL | 3 |

+------+-------+-------+----+

2 rows in set (0.00 sec)

(2) concat

select concat(name,email)from xindi;

select concat(name,email) as name from xindi;

concat()函数把这个值转化为字符串,无论输出参数是一个字符串还是一个数值, concat() 都会返回一个字符串.

(3) 三个函数year(),month(),dayofmonth()可以分别分离出日期中的年月日来。

mysql> create table stu(id int primary key,name char(10),birth date,death date);

insert stu values(1,'lili','2000-01-01','2010-01-01');

insert stu values(2,'lucy','2002-1-1','2009-1-1');

select * from stu where death>'2009-12-31';

select * from stu where month(birth)=1;

select * from stu where year(birth)>2000;

select * from stu where dayofmonth(birth)>1;

select * from stu where dayofmonth(birth)>=1;

dayofmonth()函数返回当月的第几天。。

Posted in 数据库 at March 1, 2012. by 傻猫 .    Views: 4011    No Comments